代码之家  ›  专栏  ›  技术社区  ›  theringostarrs

.NET重构应用程序以使用依赖项注入

  •  0
  • theringostarrs  · 技术社区  · 15 年前

    我目前正处于一个正在进行的项目的测试阶段,除了最基本的默认测试用例外,我很难对主服务进行测试。

    该服务目前负责创建所有子组件,我想将其更改为使用IOC容器。

    我应该使用哪个容器快速重构到一个简单的IOC设置中,我所需要的只是将集成在以下构造函数中的组件注入:

      public DataService(string applicationFolder, string pluginFolder, 
             string persistantCacheDirectory, string settingsFolder, 
             string colorsFolder, string templatesFolder) 
     {
    
      _DataSourceLoaderPlugins = new DataSourceLoaderPlugins(pluginFolder, 
                                         applicationFolder, defaultConnectionString);
      _DataSourcesService = new DataSourceService(_DataSourceLoaderPlugins);
    
      _ChartPlugins = new ChartPlugins(pluginFolder);
      //... and about 10 more dependencies
    
    }
    

    我刚接触过IOC容器,我不太确定什么是满足我基本需求的最佳框架。

    组件构造函数确实需要web.config中应用程序设置中的一些参数,这些参数将与此项目的参数一样复杂。

    此服务还需要具有单例作用域。

    人们有什么建议?什么框架简单,易于安装和使用?

    5 回复  |  直到 15 年前
        1
  •  1
  •   Bryan Watts    15 年前

    Autofac 这将是一个很好的选择在这里-它是轻量级的,很容易起来和运行。

    您可以这样注册结构:

    var builder = new ContainerBuilder();
    
    // Use the most resolvable constructor
    builder.Register<DataSourceLoaderPlugins>().As<IDataSourceLoaderPlugins>().SingletonScoped();
    
    // Use your own instance
    builder.Register(new DataSourcesService("some path")).As<IDataSourcesService>().SingletonScoped();
    
    // Reference another component
    builder.Register(c => new ChartPlugins(c.Resolve<IDataSourcesService>(), "another path")).As<IChartPlugins>().SingletonScoped();
    
    // ...other ~10 dependencies...
    
    builder.Register<DataService>().SingletonScoped();
    
    // How to resolve an instance
    
    var container = builder.Build();
    
    DataService dataService = container.Resolve<DataService>();
    

    (如果愿意,可以提供XML配置支持)

        2
  •  2
  •   Chris Fulstow    15 年前

    Castle Windsor 很快,很容易设置,这里有一个伟大的 tutorial with some examples .

        3
  •  1
  •   David Hall    15 年前

    我是一个建筑地图的狂热爱好者-我没有发现它花费了大量的努力来加快使用速度,社区非常活跃,与创建者在一起。 Jeremy Miller 特别有用。structuremap当然可以满足您的需求,并且在“标准”使用模式下都是可以实现的——基础教程应该可以看到您能够做任何想要做的事情。

    这个 StructureMap 网站是一个很好的开始的地方,有很多教程和代码示例。

    也就是说,我认为大部分主流IOC容器都能满足您的需求,这实际上取决于个人喜好,比如:

    1. 你认识的人用什么?(对我来说是一个目标,一个结构图和一个整体)
    2. 你欣赏什么开源项目,它们使用什么?(对我来说,alt.net似乎更喜欢结构图)
    3. 你是严格的微软商店吗?(那么Unity就是一条路了-我会更多地使用它,因为我的一些客户是微软独有的公司)

    如果你想了解一下有什么可以帮助你下定决心,这里有一篇很棒的博客文章 here 这是所有主要的选择。

        4
  •  1
  •   Igor Zevaka    15 年前

    这里比较了国际奥委会的章程:

    http://elegantcode.com/2009/01/07/ioc-libraries-compared/

    我将研究一些框架,这些框架允许您通过使用配置文件和编程来配置应用程序,以帮助单元测试。

        5
  •  0
  •   Tony The Lion    15 年前

    微软的统一框架很好!不难用!