繁体   English   中英

使用Ninject初始化具有初始值的字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM