【问题标题】:UnitOfWork + Repository PatternUnitOfWork + 存储库模式
【发布时间】:2019-03-29 06:44:05
【问题描述】:

我有一个很奇怪的情况。我有一个 UOW 存储库模式。我有一个包含我的实体的域层,一个包含 dbcontext (UnitofWork) 的数据访问层和不同实体的存储库。我有一个应用程序层,其中有我调用读取和写入数据的服务。架构基本上包含一些 DTO,以帮助数据的一致性。我有一个带有 MVC5 的 UI 层,我通过 Unity 注入了所有依赖项,如果我从控制器构造函数实例化每个服务,它会很好。

我已经安静了一些服务,例如 GlobalAppSvc(从 IGlobalAppSvc 实现)、SystemSettingAppSvc(ISystemSettingAppSvc)等。为了让生活更轻松,我创建了一个类似这样的名为 ApplicationManager 的类。

 public class ApplicationManager
{
    public ApplicationManager(ISystemSettingAppSvc systemSettingAppSvc, IBalanceAppSvc balanceAppSvc, IGlobalAppSvc globalAppSvc, IProfileAppSvc profileAppSvc)
    {
        SystemSettingAppSvc = systemSettingAppSvc;
        BalanceAppSvc = balanceAppSvc;
        GlobalAppSvc = globalAppSvc;
        ProfileAppSvc = profileAppSvc;
    }
    public ISystemSettingAppSvc SystemSettingAppSvc { get; set; }
    public IBalanceAppSvc BalanceAppSvc { get; set; }
    public IGlobalAppSvc GlobalAppSvc { get; set; }
    public IProfileAppSvc ProfileAppSvc { get; set; }
}

在我的 Unity 中,我已经注册了所有服务和存储库以及工作单元

container.RegisterType<IUnitOfWork, WUnitOfWork>(new PerResolveLifetimeManager(), new InjectionConstructor());
container.RegisterType<IWUnitOfWork, WUnitOfWork>(new PerResolveLifetimeManager(), new InjectionConstructor());

我通过扩展Controller 创建了一个BaseController,这样我就不必在我编写的每个控制器中解析应用程序管理器。在基本控制器中,我将此ApplicationManager 解析为

public class BaseController : Controller
{
    // GET: Base
    public ApplicationManager ApplicationManager
    {
        get;
        private set;
    }

    public BaseController()
    {

        ApplicationManager = UnityConfig.Container
            .Resolve<ApplicationManager>(); 
    }
}

然后我可以进入任何控制器并使用此BaseController 扩展控制器,我可以访问ApplicationManager.GlobalAppSvc.Methods()...

我的问题是,每当有数据修改时,比如假设有一个动作执行来扣除余额并为特定用户保存更改。当我再次请求用户的余额时,它仍然显示余额不变,但是数据库中的余额被扣除,但服务没有获取更新的数据。我究竟做错了什么?

【问题讨论】:

  • 我想知道您是否遇到了由于 PerResolveLifetimeManager 导致数据被保存在内存中的问题。你能用 TransientLifetimeManager 试试看是否能解决你的问题?
  • 嗨,我试过了,这也不起作用。像我这样解决应用程序管理器有问题吗?
  • 不能真正回答这个问题,因为我对其中使用的接口的实现一无所知?如果他们在内部管理状态,那么这很可能是您的问题。我没有看到所有代码的猜测是,您的容器生命周期导致数据在内存中保存的时间比您预期的要长。这就是我想知道瞬态是否有帮助的原因。如果无法查看所有代码,很难说发生了什么。 IUnitOfWork 和 IWUnitOfWork 有什么区别?
  • 您好,IWUnitOfWork 是 IUnitofWork 的扩展版本,用于处理特定的异常。我还注意到的另一件事是,如果我从 SQL Server Management Studio 手动对数据库中的数据进行一些更改,并且当我获取该行时它仍然显示旧数据。 _ 公共接口 IWUnitOfWork : IUnitOfWork_
  • 您必须显示其中一个调用的代码,我才能提供更多帮助。

标签: asp.net asp.net-mvc-5 unity-container repository-pattern unit-of-work


【解决方案1】:

看起来解决方案是确保 BalanceAppSvc 需要像这样在 Unity 中注册:

ApplicationManager=UnityConfig.Container.Resolve<ApplicationManager>(); and registering types as container.RegisterType<IBalanceAppSvc, BalanceAppSvc>(new PerResolveLifetimeManager());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多