当 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();
我知道这类似于服务定位器反模式,但不是我使用容器的唯一方式,并且此行为仅与应用程序的入口点相关联。
解决这个问题的正确方法是什么?
您可以将该决策逻辑放入IProvider
中。
或者,还有条件的When
绑定语法。请参阅上下文绑定。
如何使用:
kernel.Bind<ClassToDeserialize>().ToSelf()
.WithConstructorArgument(...); // default binding
kernel.Bind<ClassToDeserialize>()
.ToMethod(ctx => JsonConvert.DeserializeObject<ClassToDeserialize>(...))
.InSingletonScope()
.When(ctx => File.Exists(...));
(提示:我没有编译它,所以方法序列可能会稍微偏离)。