工作单元+存储库模式

UnitOfWork + Repository Pattern

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

我有一些服务,例如 GlobalAppSvc(从 IGlobalAppSvc 实现)、SystemSettingAppSvc (ISystemSettingAppSvc) 等。为了让生活更轻松,我创建了一个 class 像这样的 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()...

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

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

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