如何使用StructureMap对类型进行分组?

时间:2011-06-27 19:27:28

标签: ioc-container structuremap

我有一些课程

public interface IProvider
{
    void Load(int id);
}
public class Provider1 : IProvider
{
     public void Load(int id) {} 
}
public class Provider2 : IProvider
{
    public void Load(int id) {}
} 
public interface IService
{
    void Load(int id);
}
public class Service : IService
{
    IProvider provider;
    public Service(IProvider provider) { this.provider=provider; }
    public void Load(int id) { provider.Load(id); }
}

我用StructureMap注册了它们:

For<IService>().Use<Service>().Named("core"); 
For<IProvider>().Use<Provider1>().Named("core"); 
For<IService>().Use<Service>().Named("gen"); 
For<IProvider>().Use<Provider2>().Named("gen");

但是当我尝试通过

获得服务时
var service1 = ObjectFactory.GetNamedInstance<IService>("core"); 
var service2 = ObjectFactory.GetNamedInstance<IService>("gen");

所以在两种情况下,IProvider都实现了到Provider2,为什么?

我预计第一种情况下,IProvider会实现到Provider1        第二种情况是Provider2

那么,我需要注册它们才能得到我想要的东西?

2 个答案:

答案 0 :(得分:2)

您没有告诉structuremap不同的Service实例有哪些依赖关系。为了说明,使用Ctor method指示在创建实例时应该传递哪些参数。

For<IProvider>().Add<Provider1>().Named("core");
For<IProvider>().Add<Provider2>().Named("gen");
For<IService>().Add<Service>()
    .Ctor<IProvider>("provider").Is(c => c.GetInstance<IProvider>("core"))
    .Named("coreService");
For<IService>().Add<Service>()
    .Ctor<IProvider>("provider").Is(c => c.GetInstance<IProvider>("gen"))
    .Named("genService");

请注意使用Add而不是Use。 add表示我们正在添加一个新实例,use表示实例应该是默认的。因此,如果您希望能够将核心作为默认值,则可以按如下方式注册:

For<IProvider>().Use<Provider1>();
For<IProvider>().Add<Provider2>().Named("gen");
For<IService>().Use<Service>();
For<IService>().Add<Service>()
    .Ctor<IProvider>("provider").Is(c => c.GetInstance<IProvider>("gen"))
    .Named("genService");

并解决这样的实例:

var score = ObjectFactory.GetInstance<IService>();
var sgen = ObjectFactory.GetNamedInstance<IService>("genService");

答案 1 :(得分:0)

你可以尝试告诉structuremap你想要service1的IProvider的实例,其名称如下:

For<IService>().Use<Service>().Named("core").Ctor<IProvider>().Is(y => y.GetInstance<IProvider>("core"));