依赖注入 – Ninject – 如何以及何时注入

前端之家收集整理的这篇文章主要介绍了依赖注入 – Ninject – 如何以及何时注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是一个新手,当谈到DI和ninject,我正在努力一点
关于什么时候实际注射应该发生和如何启动
捆绑。

我已经在我的Web应用程序中使用它,它在那里工作正常,
但现在我想在类库中使用注入。

说我有一个这样的课程:

public class TestClass
{
    [Inject]
    public IRoleRepository RoleRepository { get; set; }
    [Inject]
    public ISiteRepository SiteRepository { get; set; }
    [Inject]
    public IUserRepository UserRepository { get; set; }

    private readonly string _fileName;

    public TestClass(string fileName)
    {
        _fileName = fileName;
    }

    public void ImportData()
    {
        var user = UserRepository.GetByUserName("myname");
        var role = RoleRepository.GetByRoleName("myname");
        var site = SiteRepository.GetByID(15);
        // Use file etc
    }

}

我想在这里使用属性注入,因为我需要传入
文件名在我的构造函数。我正确地说,如果我需要的话
传递一个构造函数参数,我不能使用构造函数注入?
如果我可以使用构造函数注入附加参数,那怎么办?
我通过这些参数?

我有一个控制台应用程序消耗的测试类,看起来像
如下:

class Program
{
    static void Main(string[] args)
    {
        // NinjectRepositoryModule Binds my IRoleRepository etc to concrete
        // types and works fine as I'm using it in my web app without any
        // problems
        IKernel kernel = new StandardKernel(new NinjectRepositoryModule());

        var test = new TestClass("filename");

        test.ImportData();
    }
}

我的问题是当我调用test.ImportData()我的仓库是null – 没有注入到它们。我已经尝试创建另一个模块并调用

Bind<TestClass>().ToSelf();

因为我认为这可能会解决TestClass中的所有注入属性,但我无处可见。

我相信这是一个微不足道的问题,但我似乎找不到
怎么走这个

你直接新建TestClass,Ninject无法拦截 – 记住没有像代码转换拦截你的消息的魔法。

你应该在做kernel.Get&TestClass>代替。

否则,您可以在使用kernel.Inject(测试)之后注入新的内容

我认为wiki中有一篇关于Inject vs Get的文章

请注意,一般来说,直接获取或注入呼叫是服务位置的一个错误的味道,这是一个反模式。在您的网络应用程序的情况下,NinjectHttpModule和PageBase是拦截对象创建的钩子 – 在其他样式的应用程序中有类似的拦截器/逻辑位置来拦截

重新绑定< TestClass>()。ToSelf(),通常标准内核具有ImplicitSelfBinding = true,这将使得不必要(除非你想影响其范围是.InTransientScope())。

最后的风格点: – 你正在使用属性注入。这很少有很好的理由,所以你应该使用构造函数注入。

并且去买Dependency Injection in .NET by @Mark Seemann,谁在这里堆叠优秀的职位,涵盖依赖注入区域内和周围很多重要但微妙的考虑。

猜你在找的设计模式相关文章