【发布时间】: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