Asp.net mvc 3 MVC3-EF4:一个用于所有存储库和ViewModels的DbContext-UnitOfWork?

Asp.net mvc 3 MVC3-EF4:一个用于所有存储库和ViewModels的DbContext-UnitOfWork?,asp.net-mvc-3,entity-framework-4.1,unit-of-work,Asp.net Mvc 3,Entity Framework 4.1,Unit Of Work,我完全卡住了 我有两个控制器:客户和地址。两者都有CustomerRepository和AddressRepository字段 有两种视图模型:CustomerViewModel和AddressViewModel。它们还有CustomerRepository和AddressRepository字段。也是一个无参数构造函数,因为它们是edit和create方法中的参数 存储库本身具有来自my Entities的DbContext对象 现在我遇到了一个又一个问题。我认为我应该只有一个DbContex

我完全卡住了

我有两个控制器:客户和地址。两者都有CustomerRepository和AddressRepository字段

有两种视图模型:CustomerViewModel和AddressViewModel。它们还有CustomerRepository和AddressRepository字段。也是一个无参数构造函数,因为它们是edit和create方法中的参数

存储库本身具有来自my Entities的DbContext对象

现在我遇到了一个又一个问题。我认为我应该只有一个DbContext与我的所有类存储库和ViewModels共享。我认为团结工作是解决办法。但我不知道如何使用它

我目前试图在controllers构造函数中创建一个DbContext,并将其传递给每个需要它的对象。但即使这样也不行


如果需要代码,我将发布它。

您的ViewModels不应该引用DbContext或存储库。ViewModels在很大程度上应该是愚蠢的。控制器的工作或控制器调用的服务是用视图所需的数据填充ViewModels


工作单元是一种很好的模式,你应该使用它。。但家长并不能解决你的问题。您的问题是,您的视图对数据模型的了解太多。

您的视图模型不应该引用DbContext或存储库。ViewModels在很大程度上应该是愚蠢的。控制器的工作或控制器调用的服务是用视图所需的数据填充ViewModels


工作单元是一种很好的模式,你应该使用它。。但家长并不能解决你的问题。您的问题是,您使视图对数据模型了解得太多。

我目前正在执行以下操作: 一个注入式iUnit使用unity注入到我的控制器中

IUnitOfWork实现IContext

IContext包含IDbSet客户和IDbSet IContext的具体实现实现了DbContext

我的控制器引用一个服务,该服务使用IUnitOfWork。 如果您使用一个存储库,那么只需将一个IContext注入控制器或IUnitOfWork,这很容易添加到上面


这样,我在请求的每个生命周期中都有一个上下文,然后它被释放。如果您需要更多的代码,请告诉我,我将在这里查看我可以发布的内容。

我目前执行以下操作: 一个注入式iUnit使用unity注入到我的控制器中

IUnitOfWork实现IContext

IContext包含IDbSet客户和IDbSet IContext的具体实现实现了DbContext

我的控制器引用一个服务,该服务使用IUnitOfWork。 如果您使用一个存储库,那么只需将一个IContext注入控制器或IUnitOfWork,这很容易添加到上面


这样,我在请求的每个生命周期中都有一个上下文,然后它被释放。如果你想要更多的代码,请告诉我,我会看看我可以在这里发布什么。

需要知道的几件事:

1.工作单位 工作单元不一定是IUnitOfWork的某种实现。这只是一种可以在许多方面应用的模式。首先,也是最重要的一点——在实际使用它之前,您应该了解它的用途,并使周围的事情变得过于复杂。此外,EF Code First DbContext API的DbContext是一种工作单元模式。您的IDBSet就是您的存储库。不要试图从ORM中抽象出来,从最简单的事情开始

2.DbContext注入 首先,只需使用构造函数注入将DbContext注入到控制器中。不要忘记设置所选的IoC容器并连接MVC的DependencyResolver。您的控制器可能看起来像示例还包含AutoMapper使用示例,请参阅关于ViewModels的下一点:

public CustomerController : Controller
{
    public CustomerController(MyDbContext data, IMappingEngine mapper)
    {
        Data = data;
        Mapper = mapper;
    }

    public MyDbContext Data { get; set; }

    public IMappingEngine Mapper { get; set; }

    // Other controller code
}
3.视图模型 同样,这是一种非常容易实现的模式—只需使用CustomerServiceWModel并使用它轻松地将客户转换为CustomerServiceWModel,您就可以这样做:

public ActionResult Details(int id)
{
    var customer = Data.Customers.FirstOrDefault(c => c.Id == id);

    if (customer == null)
        return new HttpNotFoundResult();

    return View(Mapper.Map<CustomerViewModel>(customer));
}
你可以询问汽车制造商的网站,了解如何将其连接起来并使其运行。 请注意,您不能直接从DbContext获取ViewModel。您将获得一个实体,然后将其转换为相应的视图模型


希望这有帮助

需要知道的几件事:

1.工作单位 工作单元不一定是IUnitOfWork的某种实现。这只是一种可以在许多方面应用的模式。首先,也是最重要的一点——在实际使用它之前,您应该了解它的用途,并使周围的事情变得过于复杂。此外,EF Code First DbContext API的DbContext是一种工作单元模式。您的IDBSet就是您的存储库。不要试图从ORM中抽象出来,从最简单的事情开始

2.DbContext注入 首先 ning,只需使用构造函数注入将DbContext注入到控制器中。不要忘记设置所选的IoC容器并连接MVC的DependencyResolver。您的控制器可能看起来像示例还包含AutoMapper使用示例,请参阅关于ViewModels的下一点:

public CustomerController : Controller
{
    public CustomerController(MyDbContext data, IMappingEngine mapper)
    {
        Data = data;
        Mapper = mapper;
    }

    public MyDbContext Data { get; set; }

    public IMappingEngine Mapper { get; set; }

    // Other controller code
}
3.视图模型 同样,这是一种非常容易实现的模式—只需使用CustomerServiceWModel并使用它轻松地将客户转换为CustomerServiceWModel,您就可以这样做:

public ActionResult Details(int id)
{
    var customer = Data.Customers.FirstOrDefault(c => c.Id == id);

    if (customer == null)
        return new HttpNotFoundResult();

    return View(Mapper.Map<CustomerViewModel>(customer));
}
你可以询问汽车制造商的网站,了解如何将其连接起来并使其运行。 请注意,您不能直接从DbContext获取ViewModel。您将获得一个实体,然后将其转换为相应的视图模型


希望这有帮助

ViewModel不应引用存储库!这是控制器使用存储库并用所有相关数据填充视图模型的责任。当您在控制器的构造函数中创建DbContext时,有什么不起作用?顺便说一句,这通常是通过依赖注入来解决的。你使用的是IoC容器吗?i、 e.结构图,Autofac???这可能是控制器构造函数注入无法工作的原因。尝试使用NuGet并安装StructureMap.MVC3Oh…我正在通过存储库用一些列表等填充ViewModels。。今天,我将首先改变这一点。谢谢。ViewModel不应引用存储库!这是控制器使用存储库并用所有相关数据填充视图模型的责任。当您在控制器的构造函数中创建DbContext时,有什么不起作用?顺便说一句,这通常是通过依赖注入来解决的。你使用的是IoC容器吗?i、 e.结构图,Autofac???这可能是控制器构造函数注入无法工作的原因。尝试使用NuGet并安装StructureMap.MVC3Oh…我正在通过存储库用一些列表等填充ViewModels。。今天,我将首先改变这一点。谢谢。您好,我试着从我的ViewModels中删除存储库,并在控制器中创建DbContext,然后控制器将此引用用于存储库构造函数。这很有效,因为我只有几个控制器和存储库。现在,我不知道哪一个答案应该标记为已接受。你的答案我还没试过,或者我的朋友。@Sleepwalker,嘿,我不能就此给出建议:这两个答案都不是端到端的解决方案,也从来没有打算这样做,但它们都会引导你进一步发现和做某事的模式/方法。标记对你更有用的东西!您好,我尝试从ViewModels中删除存储库,并在控制器中创建DbContext,然后将此引用用于存储库构造函数。这很有效,因为我只有几个控制器和存储库。现在,我不知道哪一个答案应该标记为已接受。你的答案我还没试过,或者我的朋友。@Sleepwalker,嘿,我不能就此给出建议:这两个答案都不是端到端的解决方案,也从来没有打算这样做,但它们都会引导你进一步发现和做某事的模式/方法。标记对你更有用的东西!嗨,Adam,你可以分享一个例子,让控制器、服务和控制器的助手函数的上下文可用,例如填充下拉列表。我正在启动一个项目,我不想把上下文到处传输。ThanksHi Adam,您可以分享一个示例,以使控制器、服务和控制器的帮助函数(例如填充下拉列表)的上下文可用。我正在启动一个项目,我不想把上下文到处传输。谢谢