Я пытаюсь реализовать универсальный репозиторий. Это то, что у меня есть до сих пор ...
public interface IRepositoryFactory
{
IRepository<T> RepositoryOf<T>() where T : class;
}
public class EntityFrameworkRepositoryFactory : IRepositoryFactory
{
private readonly IWindsorContainer _container;
public EntityFrameworkRepositoryFactory(IWindsorContainer container)
{
_container = container;
}
public IRepository<T> RepositoryOf<T>() where T : class
{
var repository = _container.Resolve<IRepository<T>>();
return repository;
}
}
RepositoryFactory используется моей реализацией единицы работы
public interface IUnitOfWork : IDisposable
{
IRepository<T> RepositoryOf<T>() where T : class;
void Commit();
}
В любом случае, я хочу задать вопрос, правильно ли зависит реализация RepositoryFactory от IWindsorContainer?
Мне нужен был способ запросить IRepository любого типа, поэтому мой код установщика делает это ...
// Windsor Container
container.Register(
Component.For<IWindsorContainer>()
.Named("Container")
.Instance(container)
);
Что, кажется, противоречит всей концепции IoC, но тогда, возможно, вся идея запроса репозитория делает это это в любом случае.
Изменить (в ответ на ответ miensol )
Я уже использую Виндзор для создания репозиториев для меня с помощью следующего кода в моем установщике ...
// Generic Repository
container.Register(
Component.For(typeof (IRepository<>))
.ImplementedBy(typeof (EntityFrameworkRepository<>))
.ServiceOverrides(
ServiceOverride.ForKey("objectContext").Eq("ObjectContext"))
);
Я в прошлом использовал ServiceLocator для достижения того, что я хочу, но читал, что это своего рода антипаттерн. Так что пытался избежать его использования. Хотя я должен признать, что я не уверен, почему, поскольку то, что я сделал, также кажется неправильным, поскольку я обязан использовать Castle Windsor в качестве своей инфраструктуры IoC / DI. Service Locator не зависит от фреймворка.
Итак, я немного запутался!