Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 存储库和工作单元模式的DI_Asp.net Mvc_Dependency Injection_Unity Container_Repository Pattern_Unit Of Work - Fatal编程技术网

Asp.net mvc 存储库和工作单元模式的DI

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; }

以前,我将无参数存储库注入我的MVC控制器:

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>();
    }
}