Как зарегистрировать Funcс контейнером Unity? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть приложение ASP.NET Core.Мне удалось зарегистрировать Func<Task<T>> в файле startup.cs, как показано ниже

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped(factory =>
        {
            Func<Task<SftpClient>> provider = async () =>
            {
                using (var serviceScope = factory.CreateScope())
                {
                    using (var dbContext = serviceScope.ServiceProvider.GetService<MyDBContext>())
                    {
                        // make async call to dbContext to get information required for SFTPClient
                        // then create instance of SFTPClient

                        var sftpClient = new SftpClient(host, port,userId,password);
                        return sftpClient;
                    }
                }
            };
            return provider;
        });
    }

Это нормально работает в приложении .Net Core.

Теперь я хочу сделать то же самое в классическом ASP.NET, используя Unity контейнер.Вот мой текущий код в ASP.NET

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterType<DbContext>(new TransientLifetimeManager(), new InjectionFactory(x => CreateDBContext()));
        container.RegisterType<Func<Task<SftpClient>>>(new TransientLifetimeManager(), new InjectionFactory(x => CreateSFTPClient()));
    }

    private static MyDBContext CreateDBContext()
    {
        MyDBContext dbContext = new MyDBContext();
        dbContext.Configuration.LazyLoadingEnabled = false;// turn-off loading on-demand
        dbContext.Configuration.ProxyCreationEnabled = false;// turn-off dynamic proxy class generation
        return dbContext;
    }

    private static Func<Task<SftpClient>> CreateSFTPClient()
    {
        Func<Task<SftpClient>> provider = async () =>
        {
             // How do i get DbContext here?
             // Do i need to create scope like i do in .NET Core?

             var sftpClient = new SftpClient(host, port,userId,password);
              return sftpClient;

        };

        return provider;
    }

Как мне получить DBContext внутри функции async?Нужно ли создавать область, как я делаю в .NET Core?

1 Ответ

0 голосов
/ 26 октября 2018

Рефакторинг CreateSFTPClient для явного внедрения контейнера

private static Func<Task<SftpClient>> CreateSFTPClient(IUnityContainer container) {
    Func<Task<SftpClient>> provider = async () => {
        // How do i get DbContext here?
        // Do i need to create scope like i do in .NET Core?
        MyDBContext dbContext = container.Resolve<MyDBContext>();

        //...

        var sftpClient = new SftpClient(host, port, userId, password);
        return sftpClient;
    };
    return provider;
}

Параметр выражения InjectionFactor затем может быть введен в функцию.

...new InjectionFactory(x => CreateSFTPClient(x)));
...