存储库、工作单元和 Unity

发布于 2024-11-27 14:41:02 字数 340 浏览 1 评论 0原文

当我“新建”一个需要依赖项的对象(即存储库、UnitOfWork)时,使用 Unity 一切都很棒,我的新对象获得注入的依赖项,并且“新建”对象可以控制 UnitOfWork、存储库,因为它们也需要 UnitOfWork 依赖项也使用相同的 UnitOfWork 进行注入(使用 PerResolve 生命周期管理器)。

一切都很好,但是我有一个问题是这个 UnitOfWork 和存储库的范围是在类级别。

如果我希望在方法级别控制 UnitOfWork 的生命周期,我应该如何处理?我应该使用方法注入吗?如果是这样,我的方法是否应该再次获取所有必需的依赖项,即存储库和 UnitOfWork ?

一些指导将不胜感激。

Using Unity when I 'new up' an object that requires dependencies i.e. Repositories, UnitOfWork all is great, my new object gets the dependencies injected and the 'newed' up object has control over the UnitOfWork, the repositories as they also require a UnitOfWork dependency get injected too, with the same UnitOfWork (using PerResolve lifetime manager).

All's good, however where I have an issue is the scope of this UnitOfWork and Repositories are at the class level.

What if I would like the lifetime of the UnitOfWork to be controlled at the method level, how should I approach this ?? Should I be using method injection ? If so should my method be taking all the required dependencies i.e. Repositories and UnitOfWork again ??

Some guidance would be greatly appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

給妳壹絲溫柔 2024-12-04 14:41:02

实际上,根据每个请求保留工作单元(用 DbContext 包装)。如果您明智地使用方法,这将是一个昂贵的解决方案。例如,

public void SaveAccount(Account account)
{
    using(var unitOfWork = unitOfFactory.CreateUnitofWork())
    {
       new Repository<Account>(unitOfWork).Attach(account);
       unitOfWork.Commit();           
    }       
}

public Account GetAccount(int id)
{
    using(var unitOfWork = unitOfFactory.CreateUnitofWork())
    {
      return new Repository<Account>(unitOfWork).Get(id);
    }
}

public void MakePayment(int fromAccount, int toAccount, decimal ammount)
{
   var from = Dao.GetAccount(fromAccount);
   var to = Dao.GetAccount(toAccount);
   from.Total -= amount;
   to.Total += amount;
   Dao.SaveAccount(from);
   Dao.SaveAccount(to);
}

我们在单一方法中使用 4 个不同的数据库连接,也不能安全地使用事务。用户每个请求的基本工作单元可以作为容器使用HttPContext。

Actually, Keep unit of work (wrap with DbContext) per request basis. If you use method wise it will be a costly solution. For example,

public void SaveAccount(Account account)
{
    using(var unitOfWork = unitOfFactory.CreateUnitofWork())
    {
       new Repository<Account>(unitOfWork).Attach(account);
       unitOfWork.Commit();           
    }       
}

public Account GetAccount(int id)
{
    using(var unitOfWork = unitOfFactory.CreateUnitofWork())
    {
      return new Repository<Account>(unitOfWork).Get(id);
    }
}

public void MakePayment(int fromAccount, int toAccount, decimal ammount)
{
   var from = Dao.GetAccount(fromAccount);
   var to = Dao.GetAccount(toAccount);
   from.Total -= amount;
   to.Total += amount;
   Dao.SaveAccount(from);
   Dao.SaveAccount(to);
}

We are using 4 different connections to the database in a single method also not safe use of transactions. User per request base unit of work can as a container you can use HttPContext.

蘑菇王子 2024-12-04 14:41:02

您不应该使用 DI 作为方法参数,至少不应该直接使用。

通常的方法是使用 IUnitOfWorkFactory 或类似的方法。将那个从容器中取出。然后在您的方法中调用工厂来获取您的工作单元对象。工厂可能(也可能不会)返回容器来完成工作。

You shouldn't be using DI for method parameter, at least not directly.

The usual approach is to have an IUnitOfWorkFactory or some such. Get that out of the container. Then in your method call the factory to get your unit of work object. The factory may (or may not) go back to the container to do it's work.

ぇ气 2024-12-04 14:41:02

在 StackOverflow 上搜索似乎建议从此处的 MVC 项目中提取 Http 请求生命周期管理器:

http://mvcunity。 codeplex.com/

由于 Unity 本身没有自己的 Http 请求生命周期管理器。

其他问题:

如何使用 unity 2.0 和 asp.net mvc 为每个 http 请求(或每个 http 上下文)注入依赖项

使用 ASP.NET 会话进行生命周期管理 (Unity)

Having a search on StackOverflow seems to suggest to pull the Http Request Lifetime Manager from the MVC project here:

http://mvcunity.codeplex.com/

Since Unity itself does not have it's own Http Request Lifetime Manager.

Other Questions:

How to inject dependencies per http request (or per http context) with unity 2.0 and asp.net mvc

Using ASP.NET Session for Lifetime Management (Unity)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文