Как сгруппировать типы с StructureMap? - PullRequest
1 голос
/ 27 июня 2011

У меня есть несколько классов

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 ]

2 голосов
/ 28 июня 2011

Вы не указываете Structuremap, какие зависимости существуют у разных экземпляров Service.Чтобы сказать, используйте метод Ctor , который указывает, какие аргументы должны быть переданы при создании экземпляра.

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.Добавление указывает, что мы добавляем новый экземпляр, использование указывает, что экземпляр должен быть по умолчанию.Поэтому, если вы хотите иметь ядро ​​по умолчанию, вы можете зарегистрироваться следующим образом:

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");
0 голосов
/ 27 июня 2011

Вы можете попытаться указать structmap, какой экземпляр IProvider вы хотите использовать для service1, с именем, подобным следующему:

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