当 Ninject 中的上下文相同时,解析多个服务绑定的更好方法

本文关键字:服务 绑定 方法 更好 Ninject 上下文 | 更新日期: 2023-09-27 18:35:10

我有一个具有工厂方法的类,当它找到自身的序列化版本时,它应该返回它;否则它应该返回自身的新实例:

class ClassToDeserialize : List<SomeClass>
{
    public static event Func<ClassToDeserialize> onNoDeserializationFile;
    public ClassToDeserialize(SomeClass firstInList)
    {
        this.Add(firstInList);
    }
    public static ClassToDeserialize DeserializeIfAny(string jsonPath)
    {
        if (File.Exists(jsonPath))
            return JsonConvert.DeserializeObject<ClassToDeserialize>(File.ReadAllText(jsonPath));
        return onNoDeserializationFile();
    }
}

我正在尝试重构我的应用程序以使用 DI,但问题是我必须为 ClassToDeserialize 进行双重绑定,如下所示:

static void Main(string[] args)
    {
        string json = @"C:'obj_serialized.txt";
        IKernel ninjectKernel = new StandardKernel();
        ClassToDeserialize.onNoDeserializationFile += (() => ninjectKernel.Get<ClassToDeserialize>("NoSerialization"));
        ninjectKernel.Bind<ClassToDeserialize>().ToSelf().Named("NoSerialization").WithConstructorArgument("jsonPath", json);
        ninjectKernel.Bind<ClassToDeserialize>().ToConstant<ClassToDeserialize>(ClassToDeserialize.DeserializeIfAny(json));
    }

我添加了 onNoDeserializationFile 事件,让 ninject 处理所有实例化并将我的业务逻辑与我的 IoC 分离,然后我打算获取一个依赖于 ClassToDeserialize 的服务,并且为了能够解决此请求,我需要找到一种方法来告诉 ninject,当找到序列化文件时,它应该调用相应的绑定(即使上下文相同)。

ninjectKernel.Get<DependantClass>().DoSomething();

我知道这类似于服务定位器反模式,但不是我使用容器的唯一方式,并且此行为仅与应用程序的入口点相关联。

解决这个问题的正确方法是什么?

当 Ninject 中的上下文相同时,解析多个服务绑定的更好方法

您可以将该决策逻辑放入IProvider中。

或者,还有条件的When绑定语法。请参阅上下文绑定。

如何使用:

kernel.Bind<ClassToDeserialize>().ToSelf()
      .WithConstructorArgument(...); // default binding
kernel.Bind<ClassToDeserialize>()
      .ToMethod(ctx => JsonConvert.DeserializeObject<ClassToDeserialize>(...))
      .InSingletonScope()
      .When(ctx => File.Exists(...));

(提示:我没有编译它,所以方法序列可能会稍微偏离)。