Как реализовать общий RepositoryFactory?

Я пытаюсь реализовать универсальный репозиторий. Это то, что у меня есть до сих пор ...

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 не зависит от фреймворка.

Итак, я немного запутался!

8
задан Community 23 May 2017 в 11:44
поделиться