UnitOfWork +存储库模式

时间:2018-10-24 18:44:20

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

我有一个非常奇怪的情况。我有一个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());

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

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

    public BaseController()
    {

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

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

我的问题是,每当进行数据修改(例如,可以说有这样的操作)时,都会执行一个操作来扣除余额并为特定用户保存更改。当我再次请求用户的余额时,它仍然显示未更改的余额,但是扣除了数据库中的余额,但是该服务未获取更新的数据。我究竟做错了什么?

1 个答案:

答案 0 :(得分:0)

解决方案似乎是要确保需要这样向Unity注册BalanceAppSvc:

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