gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:09:21 25 4
gpt4 key购买 nike

我正在构建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com