C# .Net重构应用程序以使用依赖项注入
我目前正处于一个正在进行的项目的测试阶段,除了最基本的默认测试用例之外,我在测试主服务时遇到了困难 该服务目前负责创建所有子组件,我想将其更改为使用IoC容器 我应该使用什么容器快速重构到一个简单的IoC设置,我所需要的只是将组件注入到以下构造函数中: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
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容器都能满足您的需求,这实际上取决于个人偏好,比如:
如果你想了解外面有什么可以帮助你下定决心,这里有一篇很好的博客文章,介绍了所有的主要选项。我是StructureMap的忠实粉丝-我没有发现需要花费大量的努力才能快速使用它,社区非常活跃,创建者特别有帮助。StructureMap当然可以满足您的需求,而且在“标准”使用模式下,这一切都是可以实现的——基本教程应该会让您看到您可以做任何您想要的事情 该网站是一个非常好的起点,有很多教程和代码示例 也就是说,我认为大多数主流IoC容器都能满足您的需求,这实际上取决于个人偏好,比如:
如果你想了解外面的情况以帮助你下定决心,这里有一篇很棒的博文,介绍了所有主要选项。非常快速且易于设置,这里有一个很棒的。非常快速且易于设置,这里有一个很棒的。这里有一个国际奥委会图书馆的比较:
我将研究允许您通过使用配置文件和编程来配置应用程序的框架,以帮助进行单元测试。这里有一个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更实用