У меня есть приложение 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?
Выполните рефакторинг 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)));