我是一个新手,当谈到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,谁在这里堆叠优秀的职位,涵盖依赖注入区域内和周围很多重要但微妙的考虑。