У меня есть приложение 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?