7

简而言之,如果您必须使用 IoC/DI 容器,那么它很容易部署(不喜欢使用 config/xml 文件来处理所有事情)、稳定、良好的文档并支持 .net,它会是哪一个?

可能只是我,但太多的 xml 文件,比如一个用于应用程序,一些用于 ORM,一些用于另一个组件,有时会让人不知所措。此外,在我看来,如果有一种做事方式(约定),那么搞砸的机会就会减少。

期待您的建议和可能的经验。我主要关心的是可维护性和易于部署。

4

6 回答 6

4

我认为您会在大多数容器中找到此功能。看看这篇博文。它有点陈旧,但它会给你一个想法。到目前为止,活动容器可能有更好的支持。

于 2009-01-15T20:15:21.770 回答
2

我使用NinjectStructureMap —— 两者都允许您在没有 XML 的情况下连接您的配置。

不要无耻地宣传我的网站,但我在这里写了一个关于使用 Ninject 的教程

于 2009-01-15T20:28:39.573 回答
2

也许您可以在没有容器的情况下使用 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();
}

如果你这样做,你的可执行模块将依赖于所有东西,所以你应该将它的责任限制在将东西连接在一起。您可以在其他模块中保持应用程序的大部分代码干净。

通常你不需要高级框架来管理你的依赖注入。

于 2009-01-15T20:49:54.647 回答
1

试试临富。它是目前最简单、最灵活的容器之一,并且需要最少的代码,并且它是 IOC 容器比较中唯一通过所有测试的容器。享受 :)

于 2009-01-15T22:35:51.127 回答
0

最新版本的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 的现有配置,因此我个人并没有做太多事情。但它看起来很有希望。

编辑:杰里米米勒刚刚发布了一篇关于如何创建自己的约定的帖子......

于 2009-01-15T21:16:26.967 回答
0

Castle Windsor 允许通过 Register 调用实现这一点。一个简单的场景是,假设您有很多实现IController接口的控制器:

container.Register(AllTypes.FromAssembly(assemblyA).BasedOn(typeof(IController));

您可以通过创建IService接口(无成员)并将其添加到上面来进一步简化此操作。这样,当您创建服务时,它会自动注册。

于 2009-01-20T15:03:08.047 回答