简而言之,如果您必须使用 IoC/DI 容器,那么它很容易部署(不喜欢使用 config/xml 文件来处理所有事情)、稳定、良好的文档并支持 .net,它会是哪一个?
可能只是我,但太多的 xml 文件,比如一个用于应用程序,一些用于 ORM,一些用于另一个组件,有时会让人不知所措。此外,在我看来,如果有一种做事方式(约定),那么搞砸的机会就会减少。
期待您的建议和可能的经验。我主要关心的是可维护性和易于部署。
简而言之,如果您必须使用 IoC/DI 容器,那么它很容易部署(不喜欢使用 config/xml 文件来处理所有事情)、稳定、良好的文档并支持 .net,它会是哪一个?
可能只是我,但太多的 xml 文件,比如一个用于应用程序,一些用于 ORM,一些用于另一个组件,有时会让人不知所措。此外,在我看来,如果有一种做事方式(约定),那么搞砸的机会就会减少。
期待您的建议和可能的经验。我主要关心的是可维护性和易于部署。
我认为您会在大多数容器中找到此功能。看看这篇博文。它有点陈旧,但它会给你一个想法。到目前为止,活动容器可能有更好的支持。
我使用Ninject和StructureMap —— 两者都允许您在没有 XML 的情况下连接您的配置。
不要无耻地宣传我的网站,但我在这里写了一个关于使用 Ninject 的教程。
也许您可以在没有容器的情况下使用 DI?
这是一个使用构造函数注入的示例:
public static void Main() {
ILogger logger = new FileLogger();
ISession session = new ConcreteSession();
IRepository repository = new MyDataRepositoryImpl(session, logger);
IApplication app = new MyApplication();
app.AddModule(new DataSelector(repository));
app.AddModule(new Editor(repository, new MyEditorFactory(session)));
app.AddModule(new LdapAuthenticator(session, logger));
// ...
app.Run();
}
如果你这样做,你的可执行模块将依赖于所有东西,所以你应该将它的责任限制在将东西连接在一起。您可以在其他模块中保持应用程序的大部分代码干净。
通常你不需要高级框架来管理你的依赖注入。
试试临富。它是目前最简单、最灵活的容器之一,并且需要最少的代码,并且它是 IOC 容器比较中唯一通过所有测试的容器。享受 :)
最新版本的StructureMap 2.5.2 不仅让您可以像 Ryan 所说的那样在没有 XML 的情况下配置容器,而且它还能够根据约定自动连接事物,这似乎正是您正在寻找的。
ObjectFactory.Initialize(x => x.Scan(scanner =>
{
scanner.TheCallingAssembly();
scanner.WithDefaultConventions();
}));;
来自 IAssemblyScanner.WithDefaultConvents() 上的文档:
将 DefaultConventionScanner 添加到扫描操作中。即,实现“ISomething”的名为“Something”的具体类将自动添加到PluginType“ISomething”
由于我已经拥有使用 Fluent Interface 的现有配置,因此我个人并没有做太多事情。但它看起来很有希望。
编辑:杰里米米勒刚刚发布了一篇关于如何创建自己的约定的帖子......
Castle Windsor 允许通过 Register 调用实现这一点。一个简单的场景是,假设您有很多实现IController接口的控制器:
container.Register(AllTypes.FromAssembly(assemblyA).BasedOn(typeof(IController));
您可以通过创建IService接口(无成员)并将其添加到上面来进一步简化此操作。这样,当您创建服务时,它会自动注册。