我有一些课程
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
那么,我需要注册它们才能得到我想要的东西?
答案 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"));