[英]Initialising fields with initial values with Ninject
我目前正在尝试找出如何使用Ninject为某些字段设置初始值的方法。
我有这样的事情:
public class SomeClass
{
private ISomething _something;
public SomeClass(string someParam)
{
}
public void DoAThing()
{
_something.DoSomething();
}
}
我的困境来自将_something
设置为初始值,因为我不希望类知道有关要使用的ISomething
默认实现的任何信息,是否可以在Ninject中实现此目的?
我应该补充一点,通过构造函数传递初始值不是一种选择。
我还应该补充一点,这是在一个类库中,因此有关如何以及何时进行内核和注入的设置的任何信息都很棒:)
详细说明:似乎人们可能会感到困惑,我不是在尝试将ISomething引入类中(这不是依赖项),而是ISomething的默认实现是依赖项,这就是为什么我要使用该服务-locator模式,对于实际的依赖关系,我当然会将它们放在构造函数中。
谢谢。
是的,拥有高度耦合的类并不是很好,因此依赖抽象是一个不错的选择。 但是隐藏您的依赖项不是一个很好的解决方案。 使它们对您的类的客户端可见,并使用依赖注入为您的类提供依赖的具体实现:
public class SomeClass
{
private ISomething _something;
public SomeClass(ISomething something, string someParam)
{
_something = something;
}
public void DoAThing()
{
_something.DoSomething();
}
}
还考虑创建工厂,它将为创建的SomeClass
对象提供ISomething
默认实现。
最后,我决定使用静态IOC访问类,以使我的代码能够访问类库用于主注入的核心Ninject内核。
所以:
internal static class IOC
{
private static readonly IKernel _kernel;
static IOC()
{
_kernel = new StandardKernel(new IModule[] {
new SomethingModule(),
});
}
static T Get<T>()
{
return _kernel.Get<T>();
}
}
internal sealed class SomethingModule : StandardModule
{
public override void Load()
{
Bind<ISomething>().To<ConcreteSomething>(
new ConstructorParam("arg", "value"));
}
}
然后在我上一课中:
public class SomeClass
{
private ISomething _something;
public SomeClass(string someParam)
{
_something = IOC.Get<ISomething>();
}
public void DoAThing()
{
_something.DoSomething();
}
}
现在,我可以获得具体的实现,甚至可以使用默认值对其进行初始化以启动!
使用默认值初始化具体类的方式有点脆弱,但是我敢肯定,在Ninject中有更聪明的方法可以实现这一点,但是看来服务定位器式代码和Ninject的混合解决方案确实可以正常工作好!
顺便说一句,我相信您也可以在不同的范围内使用多个IOC容器(它们自己通过Ninject:P传递),以防止创建庞然大物的“无处不在”内核。
希望这对某人有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.