Asp.net mvc 存储库和工作单元模式的DI
以前,我将无参数存储库注入我的MVC控制器:Asp.net mvc 存储库和工作单元模式的DI,asp.net-mvc,dependency-injection,unity-container,repository-pattern,unit-of-work,Asp.net Mvc,Dependency Injection,Unity Container,Repository Pattern,Unit Of Work,以前,我将无参数存储库注入我的MVC控制器: ProjectRepository实施: public class ProjectRepository : EntityFrameworkRepository<Project>, IProjectRepository { public ProjectRepository() { } } MVC控制器: private IProjectRepository _projectRepository { get; set; }
ProjectRepository
实施:
public class ProjectRepository : EntityFrameworkRepository<Project>, IProjectRepository
{
public ProjectRepository()
{ }
}
MVC控制器:
private IProjectRepository _projectRepository { get; set; }
public ProjectController(IProjectRepository projectRepository)
{
_projectRepository = projectRepository;
}
这很有效
现在,我已经在我的存储库类中实现了一个工作单元模式,这样我就可以提交对数据的事务性更改(特别是在对多个存储库进行更改时)
新的ProjectRepository
实现在其构造函数中接受IUnitOfWork
:
public class ProjectRepository : EntityFrameworkRepository<Project>, IProjectRepository
{
public ProjectRepository(IUnitOfWork unitOfWork): base(unitOfWork)
{ }
}
控制器中还可以注入多个存储库。如何使用相同的IUnitOfWork实例化所有这些内容?当您注册
IUnitOfWork
实例时,请使用PerResolveLifetimeManager
,这将确保单个IUnitOfWork
容器中的每个依赖项都得到相同的实例
public ProjectController(IProjectRepository projectRepository, IUnitOfWork unitOfWork)
{
_projectRepository = projectRepository;
_unitOfWork = unitOfWork;
}
例如:
public class SomeDependency
{
}
public class Service
{
public Service(SomeDependency someDependency, SomeDependency someDependency2)
{
Console.WriteLine(someDependency == someDependency2);
}
}
public static void Main()
{
using(var container = new UnityContainer())
{
container.RegisterType<SomeDependency>(new PerResolveLifetimeManager());
container.Resolve<Service>();
}
}
公共类依赖项
{
}
公务舱服务
{
公共服务(SomeDependency SomeDependency,SomeDependency SomeDependency 2)
{
Console.WriteLine(someDependency==someDependency2);
}
}
公共静态void Main()
{
使用(var container=new UnityContainer())
{
RegisterType(新的PerResolveLifetimeManager());
container.Resolve();
}
}
这将向控制台输出True
有关更多详细信息,请参阅该页。如果您开始这样做,您将脱离CRUD应用程序,控制器中的逻辑量将增加。现在是开始转向另一种模式的时候了。将工作单元和存储库移动到业务层,并将执行业务逻辑的抽象注入控制器中。换句话说:从表示层完全隐藏处理请求的方式。我建议使用@Steven:本质上,存储库代码实际上位于服务类中,因此它可以实现这一点(上面的代码只是一个示例)。但我也会遇到同样的问题。
ProjectService
构造函数将被注入IProjectRepository
和IUnitOfWork
。如何确保IUnitOfWork
实例随后也被注入到IProjectRepository
构造函数中?如果已经将IUnitOfWork注入到存储库中,则无需将其注入控制器。只需使用PerWebRequest生活方式向您的容器注册IUnitOfWork,以便在所有存储库中为单个web请求使用相同的实例。对不起,我上面所说的不是真的,因为您必须在某个地方调用IUnitOfWork.Commit()。这就是我也使用命令处理程序的原因。相关:
public class SomeDependency
{
}
public class Service
{
public Service(SomeDependency someDependency, SomeDependency someDependency2)
{
Console.WriteLine(someDependency == someDependency2);
}
}
public static void Main()
{
using(var container = new UnityContainer())
{
container.RegisterType<SomeDependency>(new PerResolveLifetimeManager());
container.Resolve<Service>();
}
}