Autofac - Динамическое создание фабрики (func <>) - PullRequest
0 голосов
/ 26 апреля 2018

Стандартный подход заключается в создании экземпляра фабрики и в реализации вызова фабрики Resolve (). Я не хочу привязывать свой класс к контейнеру, потому что это кажется плохой практикой.

Стандартный подход:

    T IDataRepositoryFactory.GetDataRepository<T>()
    {
        return MyProject.Bootstrapper.Container.Resolve<T>();
    }

Вместо этого я пытаюсь использовать динамическое создание

public class SomethingManager
{
    private readonly Func<Type, IRepository> repositoryFactory;

    public SomethingManager(Func<Type, IRepository> aRepositoryFactory)
    {
        repositoryFactory = aRepositoryFactory;
    }

    public void GetSomething()
    {
        var repo1 = repositoryFactory(typeof(IBlogRepository));
        var repo2 = repositoryFactory(typeof(IUserRepository));
        (...)
    }
}

Проблема в получении конкретной реализации. При стандартном подходе я мог бы сделать что-то вроде этого:

var something = repositoryFactory.GetDataRepository<IBlogRepository>();

С помощью динамической реализации от Autofac я могу передать интерфейс здесь:

var something = repositoryFactory(typeof(IBlogRepository));

но я понятия не имею, как правильно зарегистрировать это в autofac. Какой обходной путь или решение этой проблемы?

1 Ответ

0 голосов
/ 26 апреля 2018

Зарегистрируйте универсальный класс, который параметризует фабрику своим собственным параметром типа.

public class SomethingClient<T>
{
    private readonly Func<T> somethingFactory;

    public SomethingClient(Func<T> aSomethingFactory)
    {
        somethingFactory = aSomethingFactory;
    }

    public void SomeDynamicScenario()
    {
        var something = repositoryFactory();
        //operate on new object
    }
}

Регистрация:

var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(SomethingClient<>)).AsSelf();

Решение:

Просто введите SomethingClient<SomeParticularType> там, где вам нужно.

...