2009-12-08 44 views
0

我想为我的IOC容器创建一个接口包装,所以我不必对特定的依赖关系。我的问题是,我有一些服务类中的公司ID是字符串。我想制作通用接口方法,如IOC Container和primatives当创建包装

T Resolve<T>()其中T是服务接口。

现在我用StructureMap幕后,知道如果混凝土构造函数接受的companyID所以我会做这样的事情:

ObjectFactory.With("companyid").EqualTo("someCompanyID").GetInstance<ICompanyService>();

我换这种接口中的方法调用的: ICompanyService GetCompanyService(string companyID)

我现在拥有它的方式,应用程序必须初始化StructureMaps配置和具体类,传回服务,必须知道很多关于构造函数。我希望不会发生,并使包装通用。有没有一种很好的方法,而不必将companyID添加到接口上的每个方法?

回答

2

我个人并不在乎抽象出MSUnity(我选择的IOC容器)。对我而言,这太过分了。这听起来像你正在使用结构图特定的功能,这将使抽象更难。

您是否知道CommonServiceLocator project?主要有两种方法:

protected override object DoGetInstance(Type serviceType, string key) { } 
protected override IEnumerable<object> DoGetAllInstances(Type serviceType) {} 

提供你坚持使用这些,你可以很容易地切换。这里是some more info

+0

我有SM抽象了一点,只是不完全。我正在看一些制作封装的开源代码,但它没有考虑到ctors中的基元。 – CSharpAtl 2009-12-08 16:03:04

+0

@ CSharpAtl-重新考虑您的设计。像这样的框架必须与最低公分母一起工作。您需要确定能否切换您的IOC比能够使用StructureMap特定功能更重要。 – RichardOD 2009-12-08 16:05:08

+0

@RichardOD我同意。 – pattersonc 2009-12-08 16:08:35

0

MvcContrib中有一个DependencyResolver类。

另一方面,大多数时候我只从我的应用程序项目中提取IoC容器。例如,我只是简单地为ctor注入设置我的类,并且当我需要获取实例(在应用程序项目中)时,我只需向IoC容器询问它。 IoC容器可能会担心填充参数,但对象不知道IoC容器。这样我的应用程序项目是唯一需要引用IoC容器的项目。