Как мне использовать IoC DI с этим шаблоном хранилища? - PullRequest
2 голосов
/ 30 ноября 2010

Я использую шаблон хранилища, найденный в ответе на этот вопрос SO:

Преимущество создания общего хранилища по сравнению с конкретным хранилищем для каждого объекта?

А именно, каждый репозиторий наследует от абстрактного базового класса, который содержит универсальные методы, такие как add, delete и т. Д., А также реализует специальный интерфейс репозитория для любых методов, уникальных для этого репозитория / сущности.

, т.е..

public class CompanyRepository : Repository<Company>, ICompanyRepository {
...
}

На своем бизнес-уровне я использую Structure Map для получения экземпляра хранилища, но я не уверен, как его использовать.

 // Structure Map initialisation
 ObjectFactory.Initialize(
 x =>
 {                    
      x.For<ICompanyRepository>().Use<CompanyRepository>();
 });

разрешение экземпляра:

return ObjectFactory.GetInstance<ICompanyRepository>();

Однако экземпляр, который я получаю, является интерфейсом, а не всей реализацией репозитория.У меня нет доступа к методам базового класса (Repository<Company>).Как обычно это сделать?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2010

Ключевым моментом здесь является восприятие Repository<> исключительно как детали реализации.Вы не будете обращаться к каким-либо методам напрямую;вместо этого вы будете выставлять все методы, включая Insert и Delete, на интерфейсе:

public interface ICustomerRepository
{
    // ...Customer-specific queries...

    void Insert(Customer customer);

    void Delete(Customer customer);
}

Когда вы реализуете интерфейс в CustomerRepository, вам просто нужно передать Insert иDelete обращается к защищенным методам Repository<>, как обсуждалось в первоначальном вопросе.

Регистрация StructureMap, которую вы указали в вопросе, именно то, что я ожидал.Цель Repository<> заключается в том, чтобы помочь в реализации специфичных для объекта интерфейсов.Помните, что интерфейсы всегда будут содержать полный публичный API хранилища, и это должно указывать вам правильное направление.

1 голос
/ 30 ноября 2010

Почему бы не

return ObjectFactory.GetInstance<Repository<Company>>;

? Вам нужно будет соответственно изменить инициализацию ObjectFactory:

// Structure Map initialisation
ObjectFactory.Initialize(
    x => {                    
      x.For<Repository<Company>>().Use<CompanyRepository>();
    });

EDIT
Если вы все еще хотите получить Repository<Company> также для ICompanyRepository, вам нужно объявить переадресацию:

// Structure Map initialisation
ObjectFactory.Initialize(
    x => {                    
      x.For<Repository<Company>>().Use<CompanyRepository>();
      x.Forward<Repository<Company>, ICompanyRepository>();
    });
...