C# .Net重构应用程序以使用依赖项注入

C# .Net重构应用程序以使用依赖项注入,c#,refactoring,frameworks,dependency-injection,inversion-of-control,C#,Refactoring,Frameworks,Dependency Injection,Inversion Of Control,我目前正处于一个正在进行的项目的测试阶段,除了最基本的默认测试用例之外,我在测试主服务时遇到了困难 该服务目前负责创建所有子组件,我想将其更改为使用IoC容器 我应该使用什么容器快速重构到一个简单的IoC设置,我所需要的只是将组件注入到以下构造函数中: public DataService(string applicationFolder, string pluginFolder, string persistantCacheDirectory, string setti

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

该服务目前负责创建所有子组件,我想将其更改为使用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中的应用程序设置中的一些参数,这将与此项目一样复杂

此服务还需要具有singleton作用域


人们有什么建议?什么样的框架简单、易于设置和实施

微软的Unity框架很好!不难使用

微软的Unity框架很好!不难使用

我是StructureMap的忠实粉丝-我没有发现它需要花费大量的精力来加快使用速度,而且社区非常活跃,创建者特别乐于助人。StructureMap当然可以满足您的需求,而且在“标准”使用模式下,这一切都是可以实现的——基本教程应该会让您看到您可以做任何您想要的事情

该网站是一个非常好的起点,有很多教程和代码示例

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

  • 你认识的人用什么?(对我来说是Ninject、StructureMap和Unity)
  • 你欣赏哪些开源项目,它们使用什么?(对我来说,Alt.Net似乎更喜欢StructureMap)
  • 你是一家严格的微软商店吗?(那么Unity就是一条出路——我将更多地使用它,因为我的一些客户是一家只支持微软的公司)

  • 如果你想了解外面有什么可以帮助你下定决心,这里有一篇很好的博客文章,介绍了所有的主要选项。

    我是StructureMap的忠实粉丝-我没有发现需要花费大量的努力才能快速使用它,社区非常活跃,创建者特别有帮助。StructureMap当然可以满足您的需求,而且在“标准”使用模式下,这一切都是可以实现的——基本教程应该会让您看到您可以做任何您想要的事情

    该网站是一个非常好的起点,有很多教程和代码示例

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

  • 你认识的人用什么?(对我来说是Ninject、StructureMap和Unity)
  • 你欣赏哪些开源项目,它们使用什么?(对我来说,Alt.Net似乎更喜欢StructureMap)
  • 你是一家严格的微软商店吗?(那么Unity就是一条出路——我将更多地使用它,因为我的一些客户是一家只支持微软的公司)

  • 如果你想了解外面的情况以帮助你下定决心,这里有一篇很棒的博文,介绍了所有主要选项。

    非常快速且易于设置,这里有一个很棒的。

    非常快速且易于设置,这里有一个很棒的。

    这里有一个国际奥委会图书馆的比较:


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

    这里有一个IoC库的比较:

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

    在这里是一个不错的选择,它是轻量级的,并且非常容易启动和运行

    您可以这样注册您的结构:

    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>();
    
    var builder=newcontainerbuilder();
    //使用最可解析的构造函数
    builder.Register().As().SingletonScoped();
    //使用您自己的实例
    注册(新的DataSourceService(“某些路径”)).As().SingletonScope();
    //引用另一个组件
    注册(c=>newchartplugins(c.Resolve(),“另一个路径”)).As().SingletonScoped();
    //…其他10个依赖项。。。
    builder.Register().SingletonScoped();
    //如何解析实例
    var container=builder.Build();
    DataService DataService=container.Resolve();
    
    (如果您愿意,可以使用XML配置支持)

    将是一个很好的选择—它轻量级,并且非常容易启动和运行

    您可以这样注册您的结构:

    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>();
    
    var builder=newcontainerbuilder();
    //使用最可解析的构造函数
    builder.Register().As().SingletonScoped();
    //使用您自己的实例
    注册(新的DataSourceService(“某些路径”)).As().SingletonScope();
    //引用另一个组件
    注册(c=>newchartplugins(c.Resolve(),“另一个路径”)).As().SingletonScoped();
    //…其他10个依赖项。。。
    builder.Register().SingletonScoped();
    //如何解析实例
    var container=builder.Build();
    DataService DataService=container.Resolve();
    

    (如果您愿意,可以使用XML配置支持)

    不,它不好,如果您说它不难使用,那么您就没有使用过任何其他配置。不,它不好,如果您说它不难使用,那么您就没有使用过任何其他配置。这个比较是否过时了?ninject现在似乎不同了,它支持属性,可能比StructureMap更实用。这种比较不是过时了吗?如今,ninject似乎有所不同,它支持属性,甚至可能比StructureMap更实用