Справка по настройке StructureMap - PullRequest
1 голос
/ 09 августа 2011

У меня есть интерфейс, называемый IRepository, с двумя реализациями:

  • SqlRepository

  • SqlDualWriterRepository

Первая реализация - это обычная реализация персистентности SQL для объектов типа T. Она зависит от экземпляра SqlConnectionStringProvider (который предоставляет строку подключения, как следует из названия, и принимает в качестве параметра конструктора имя строки подключения).

Вторая - это другая реализация, которая использует внутренне две зависимости SQLRepository:

public class SqlDualWriterRepository<T> : IRepository<T>
{
    private readonly IRepository<T> _primaryRepository;
    private readonly IRepository<T> _secondaryRepository;

    public SqlDualWriterRepository(
        IRepository<T> primaryRepository,
        IRepository<T> secondaryRepository)
    {
        _primaryRepository = primaryRepository;
        _secondaryRepository = secondaryRepository;
    }

}

Чего я хочу добиться, так это настроить StructureMap так, чтобы при запросе экземпляра IRepository,он будет:

  1. разрешить IRepository для экземпляра SqlDualWriterRepository
  2. разрешить два внутренних хранилища для типа SqlRepository
  3. для двух объектов SqlRepository, созданных на шаге 2, которые мне нужныразрешить SqlConnectionStringProvider другим способом (провопределение различных строковых параметров в конструкторе)

Я понятия не имею, как этого добиться.Есть ли способ сделать это с помощью атрибутов или других типов конфигурации?

Я использую StructureMap 2.6.2.0.

1 Ответ

1 голос
/ 10 августа 2011

Я нашел два решения:

  1. Использование лямбды, чтобы сообщить StructureMap, как построить экземпляр SqlDualWriterRepository, который будет решать зависимости IRepository:

    x.For<IRepository<Type>>().Use(
            ()=> new SqlDualWriterRepository<Type>(
                NewPrimaryRepositoryInstance<Type>(),
                NewSecondaryRepositoryInstance<Type>()));
    
  2. Использование .Ctor <> () для явного указания, что создавать для каждой зависимости конструктора:

    x.For<IRepository<Type>>().Use<SqlDualWriterRepository<Type>>()
            .Ctor<IRepository<Type>>("primaryRepository").Is(NewPrimaryRepositoryInstance<Type>())
            .Ctor<IRepository<Type>>("secondaryRepository").Is(NewSecondaryRepositoryInstance<Type>());
    

В обоих приведенных выше примерах методы NewPrimaryRepositoryInstance () и NewSecondaryRepositoryInstance ()создайте первичный и вторичный репозитории SqlRepositories с соответствующими конфигурациями SqlConnectionStringProvider.

Вероятно, есть более эффективные способы достижения этого, но эти решения пока делают это.

...