依赖注入 – 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,谁在这里堆叠优秀的职位,涵盖依赖注入区域内和周围很多重要但微妙的考虑。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |