也许这个问题有一些解释,但找不到最好的解决方案:
我正在阅读Mark Seemann 的这篇关于强制依赖的博客文章,据我所知,在文章末尾,他得出的结论是永远不要使用或至少尝试避免强制依赖,否则会有麻烦(到目前为止还可以))。这里是另一个职位从Autofac文档。
他们建议仅按目的使用俘虏依赖项(当您知道自己在做什么时!)。这让我想到了我在我的网站上遇到的情况。我有 10 个服务,它们都依赖于DbContext数据库操作。我认为它们可以很容易地被注册,就InstancePerLifetimeScope好像我解决了这个问题,DbContext因为它不会永远保存在我的服务附带的内存中。(在我的情况下,我使用的是 Autofac)。所以,我认为一个好的起点是根据生命周期实例和DbContext每个请求创建所有这些实例。然后在我的服务中,我会使用类似的东西:
public class MyService
{
private readonly IDbContext _dbContext = DependencyResolver.Current.GetService<IDbContext>();
private MyModel GetMyModel() => Mapper.Map<MyModel>(_dbContext.MyTable.FirstOrDefault());
}
然后在我的启动课程中,我有:
builder.RegisterType<ApplicationDbContext>().As<IDbContext>().InstancePerRequest();
builder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();
这个模式是否正常工作,我的意思是不将dbContext永远附加到任何服务,所以它将在请求结束时被处理,如果它有效,这一行是否有任何性能问题:
private readonly IDbContext _dbContext = DependencyResolver.Current.GetService<IDbContext>();
与构造函数注入相比(从 dbContext 到数据库有很多调用,所以IDbContext每次我想使用它时我都害怕,因为它可能会消耗资源)?
我想dbContext每个请求都实例化而不是每个依赖项实例化的原因是我已经在dbContext对象之上实现了工作单元模式。
我的控制器中的正常方法如下所示:
public ActionResult DoSth()
{
using(var unitOfWork = UnitOfWorkManager.NewUnitOfWork())
{
//do stuff
try
{
unitOfWork.Commit();
return View();
}
catch(Exception e)
{
unitOfWork.RollBack();
LoggerService.Log(e);
return View();
}
}
}
如果这工作正常,那么还有一个我担心的问题。因此,如果我可以将我的服务作为每个生命周期的实例(DbContext 除外),那么在服务内部的每个方法上应用 async-await 以使其成为非阻塞方法是否有任何问题。我问这个dbContext实例使用 async-await 是否有任何问题,例如,我会有这样的事情:
public async MyModel GetMyModel()
{
var result = //await on a new task which will use dbcontext instance here
return Mapper.Map<MyModel>(result);
}
非常感谢任何建议或建议!
LEATH
慕容708150
相关分类