c# - 我应该尝试隐藏 IoC 容器(如果是这样,有什么提示)吗?

标签 c# inversion-of-control ioc-container

我正在构建一个 CMS,它有许多扩展点(数据/内容类型、插件、宏、主题),其中一些扩展需要注册服务。到目前为止,扩展仅依赖于“MyProject.Core”库,如果它们不依赖于任何特定的 IoC 框架就好了。现在我在考虑是否应该构建另一层来隐藏 IoC 特定注册。问题是我需要一些高级功能。

例如“Data/ContentType”服务的 NHibernate 实现(温莎城堡风格)

container.Register(Component.For<IPageRepository>().ImplementedBy<NHPageRepository>());
container.Register(Component.For<ISessionFactory>().Instance(NHibernateHelper.CreateSessionFactory()));
container.Register(Component.For<ISession>().UsingFactoryMethod(c => c.Resolve<ISessionFactory>().OpenSession()).LifeStyle.PerWebRequest);

第三行是“硬行”。我可以做一个像

这样的界面
interface IMyContainer
{
    Register<TService>(Func<IMyContainer,TService> factoryMethod)
    Register<TService>(Func<IMyContainer,TService> factoryMethod, LifeStyle lifeStyle)
    // ...
}

但是“翻译”这个注册(我的 IoC 抽象)

public class NHInstaller :  IInstaller
{
    public void Install(IMyContainer container)
    {
        container.Register<ISession>(c => c.Resolve<ISessionFactory>().OpenSession(), LifeStyle.PerRequest);
    }
}

到这个(温莎)

container.Register(Component.For<ISession>().UsingFactoryMethod(c => c.Resolve<ISessionFactory>().OpenSession()).LifeStyle.PerWebRequest);

可能很难。

那么,我应该尝试进行抽象吗?有什么有用的资源吗? 还是我应该只选择一个 IoC 容器并坚持使用它?

我也可以将现有工具(CaSTLe Windsor 或 Ninject)的源代码作为我的库的一部分,但我并不真正了解这些许可证。我可以这样做吗?我可以更改命名空间和类名以适应我的应用程序的结构吗?我要发布源代码,我真的不在乎许可证是什么。

最佳答案

这取决于您所说的“隐藏”是什么意思。最佳实践是应用程序中只有一个地方(Composition Root)知道 IoC 容器。坚持Hollywood Principle - 避免有多个知道 IoC 容器的类。换句话说,不要传递容器;如果非根类需要创建其他对象,则将工厂注入(inject)其中。

如果您正在编写一个框架并且希望允许消费者插入他们选择的 IoC 容器框架,您可以使用 Common Service Locator图书馆。对于大多数项目来说,这可能有点矫枉过正。 (有关我更改措辞的原因,请参阅 Mark Seemann's excellent link)。

关于c# - 我应该尝试隐藏 IoC 容器(如果是这样,有什么提示)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7223598/

相关文章:

c# - 正则表达式匹配路径

c# - Oracle.DataAccess (ODP.NET) 数组绑定(bind) "Value does not fall within the expected range"

c# - if((attributes and File Attributes.Hidden) == File Attributes.Hidden) { } 如何工作?

java - 将参数传递给 Spring MethodInvokingFactoryBean 参数列表

dependency-injection - Autofac 能否按照注册顺序返回某个类型的所有服务?

c# - 获取错误找不到类型或命名空间名称 'T'(是否缺少 using 指令或程序集引用?)

mvvm - 使用 Unity 2.0 对 "Blendable"ViewModelLocator 的建议

asp.net-mvc - 用IoC在Controller中注入(inject)HttpContextBase的目的是什么

c# - 简单喷油器跟踪时间

c# - 可能的 GetObjectsOfType 替换