Недавно я решил что-то подобное, выполнив небольшой редизайн, который сделал все намного проще.Это может сработать и для вас.Вы можете попробовать удалить определенные интерфейсы, такие как ITeamEmployeeRepository
и ILoanedItemRepository
из вашего дизайна.Я сделал это с помощью методов расширения.Вот пример:
public static class RepositoryExtensions
{
public static TeamEmployee GetById(
this IRepository<TeamEmployee> repository, int id)
{
return repository.Single(e => e.TeamEmployeeId == id);
}
public static IQueryable<Salesman> GetActiveSalesmen(
this IRepository<ISalesmanRepository> repository)
{
return repository.Where(salesman => salesman.Active);
}
// etc
}
После этого я создал IRepositoryFactory
, который позволил мне создавать репозитории определенного типа:
public interface IRepositoryFactory
{
IRepository<T> CreateNewRepository<T>();
}
Когда этот интерфейс установлен на месте, онЛегко создать реализацию этой фабрики, которая просит контейнер создать бетон Repository<T>
.RepositoryFactory
может выглядеть так:
public class RepositoryFactory : IRepositoryFactory
{
public IRepository<T> CreateNewRepository<T>()
{
return ObjectFactory.GetInstance(typeof(Repository<T>));
}
}
При таком дизайне вам нужно зарегистрировать бетон RepositoryFactory
только через интерфейс IRepositoryFactory
, и все готово.Вместо внедрения IRepository<ITeamEmployeeRepository>
в старом дизайне, вы теперь внедряете IRepositoryFactory
и позволяете клиенту вызывать метод CreateNewRepository<T>
.Из-за использования методов расширения вы можете вызывать специфичные для типа методы в репозитории.
Еще одно преимущество этого заключается в том, что вам не нужно повторно реализовывать методы, которые вы изначально определили в ITeamEmployeeRepository
на каждомреализация.
Этот дизайн очень хорошо работал в моей ситуации, особенно потому, что мои IRepository<T>
интерфейсы используют деревья выражений.Конечно, я не могу увидеть, работает ли такой дизайн для вас, но я надеюсь, что он будет.
Удачи.