【发布时间】:2011-07-12 08:11:12
【问题描述】:
我们正在使用 NInject 框架在我们的应用程序中实现 IoC/DI。我们有具有内部方法的内部类。要实现 IoC/DI,我们必须提取接口。但是如果我们在一个内部类中只有内部方法,我们就不能为这个类提取接口。
那么有没有办法在这种情况下实现 IoC/DI(内部类只有内部方法)或者我们应该将内部方法更改为公共方法。请建议。谢谢
【问题讨论】:
标签: ioc-container ninject
我们正在使用 NInject 框架在我们的应用程序中实现 IoC/DI。我们有具有内部方法的内部类。要实现 IoC/DI,我们必须提取接口。但是如果我们在一个内部类中只有内部方法,我们就不能为这个类提取接口。
那么有没有办法在这种情况下实现 IoC/DI(内部类只有内部方法)或者我们应该将内部方法更改为公共方法。请建议。谢谢
【问题讨论】:
标签: ioc-container ninject
如果您的类已经是内部的,那么内部方法和公共方法之间绝对没有区别。内部类的公共方法只在内部可见。
如果你仍然坚持注入具体的类,尽管你失去了 DI 的所有优势。所以是的,您应该提取(内部)接口并注入接口。这要求配置代码可以通过在同一程序集中访问类的程序集必须声明为友元程序集。此外,您必须将 Ninject 配置为不允许公共类。请参阅 NinjectSettings。
【讨论】:
您真正需要公开的只是接口(而不是具体的实现)。
您可以使用抽象工厂或(更简单的)Ninject 将公共接口映射到内部具体;因此,您的客户端代码只需请求一个实现接口的“事物”实例,您的工厂/容器将返回该实现。
您应该阅读 Dependency Inversion Principle 以及与此相关的内容。
【讨论】:
您可以像这样在 AssemblyInfo.cs 文件中使用 InternalsVisibleTo 属性
[assembly: InternalsVisibleTo("Assembly_That_Should_Access_The_Internal_Class")]
【讨论】: