【问题标题】:Is there a .NET IoC that prefers convention over configuration?是否有一个 .NET IoC 更喜欢约定而不是配置?
【发布时间】:2009-01-15 20:06:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net dependency-injection inversion-of-control


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我使用NinjectStructureMap——它们都允许你在没有XML 的情况下连接你的配置。

      不要无耻地宣传我的网站,但我写了一篇关于使用 Ninject 的教程here

      【讨论】:

      • 我喜欢人们在他们的例子中使用汽车来解释软件 :)
      • 我访问ryanlanciaux.com/post/…得到了这个“文件意外结束。以下元素未关闭:作者、评论、cmets、帖子。第35963行,位置15。”
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 有趣!!通过所有测试是什么意思??
        • 作者对所有 IOC 框架进行了详尽的比较,他甚至列出了一些可以使 IOC 框架更加灵活的特性。 LinFu 是比较图表上唯一一个实现了他的愿望清单上所有“必需”和可选功能的人。
        • 是的,就是我。我有偏见,但我认为缺少设置代码不言自明。
        【解决方案5】:

        StructureMap 的最新版本 2.5.2 不仅可以让您像 Ryan 所说的那样在没有 XML 的情况下配置您的容器,而且它还能够根据约定自动连接事物,这似乎正是您所想要的正在寻找。

        ObjectFactory.Initialize(x => x.Scan(scanner =>
                                                {
                                                   scanner.TheCallingAssembly();
                                                   scanner.WithDefaultConventions();
                                                }));;
        

        来自 IAssemblyScanner.WithDefaultConvents() 上的文档:

        将 DefaultConventionScanner 添加到 扫描操作。即,一个 名为“Something”的具体类 实现“ISomething”将是 自动添加到 PluginType “我的东西”

        我个人并没有做太多,因为我已经有了使用 Fluent 界面的现有配置。但它看起来很有希望。

        编辑: Jeremy Miller 刚刚在how to create your OWN Conventions... 上发了一个帖子@

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-03-18
            • 2011-06-18
            • 1970-01-01
            • 2022-01-03
            • 2010-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多