Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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 如何在n层存储库模式中共享DbCOntext。NETMVC_Asp.net Mvc_Entity Framework_Asp.net Mvc 4_Repository Pattern_Dbcontext - Fatal编程技术网

Asp.net mvc 如何在n层存储库模式中共享DbCOntext。NETMVC

Asp.net mvc 如何在n层存储库模式中共享DbCOntext。NETMVC,asp.net-mvc,entity-framework,asp.net-mvc-4,repository-pattern,dbcontext,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Repository Pattern,Dbcontext,首先,我必须说,我知道他们是我在stackoverflow上发现的一个非常接近的问题,但我的问题有点不同 我在asp.NETMVC中有n层应用程序,其中我有:一个BOL项目(有EF类和db对象等),BLL项目(有内置逻辑),比我们有DAL项目(有db交互逻辑,使用BOL中的EF dbcontext)和主mvc项目,ahs控制器和视图等 现在,我们正在使用存储库模式,我们在BLL中有许多存储库及其接口。而且我们在DAL中有许多没有接口的存储库。但是所有这些DAL存储库中都有一个DbContext成

首先,我必须说,我知道他们是我在stackoverflow上发现的一个非常接近的问题,但我的问题有点不同

我在asp.NETMVC中有n层应用程序,其中我有:
一个BOL项目(有EF类和db对象等),
BLL项目(有内置逻辑),
比我们有DAL项目(有db交互逻辑,使用BOL中的EF dbcontext)
和主mvc项目,ahs控制器和视图等

现在,我们正在使用存储库模式,我们在BLL中有许多存储库及其接口。而且我们在DAL中有许多没有接口的存储库。但是所有这些DAL存储库中都有一个DbContext成员,它是在它们的构造函数中创建的,因此每个DAL存储库都与它创建的DbContext的单独实例进行交互。


在我们的主mvc项目中,我们使用ninject将BLL存储库注入控制器构造函数中(在请求范围内)。现在,我们面临的问题是,每个BLL存储库都有对一个或多个DAL存储库的引用,这些DAL存储库中的每一个都使用各自独立的DbCOntext。这是错误和糟糕的,这就是为什么我在寻找在所有DAL存储库中每个请求共享一个DbCOntext的方法(无论ninject在我的控制器中注入了多少BLL存储库,只要确保每个请求只创建和使用一个DbCOntext实例)。并在每次请求后处理该上下文。

我认为的一种方法是不在DAL存储库的构造函数中创建DBcontext。但是有一些方法调用(比如initialedbcontext),然后在BLL存储库中添加此方法,它只调用其成员DAL存储库的smae方法。为控制器构造函数中的一个BLL存储库调用该方法,然后使用一个方法从第一个存储库中获取和设置所有其他存储库中的db上下文。但我知道这是一种糟糕的方法,首先我们在controller中创建DbContext,它应该只在DAL中创建,其次我在DAL以及BLL存储库中添加create、get和set DbContext方法,因为我需要将DbContext传递给BLL,BLL将传递给它内部通信的DAL存储库。这很糟糕

这就是为什么我在这里要求任何好的模式来实现“在具有存储库模式的N层中每个请求一个DBCONTEXT。”

您可以编写一个BaseRepository并在所有存储库类中实现BaseRepository。
公共类基库
{
公共学生团体和学生团体;
公共基本存储库()
{
dbStudentEntity=新学生实体();
}
}
数据存储库:
公共类CurrencyData:BaseRepository、ICurrencyData
{
公共列表GetCurrencyList()
{
var objcurrences=dbStudentEntity.currences.ToList();
List currencyList=新列表();
foreach(对象货币中的var项目)
{
var模型=新模型。货币{CurrencyId=item.CurrencyId,Currency1=item.Currency1,Code=item.Code,Symbol=item.Symbol,Country=item.Country};
currencyList.Add(模型);
}
退货清单;
}
}
您可以编写一个BaseRepository并在所有存储库类中实现BaseRepository。
公共类基库
{
公共学生团体和学生团体;
公共基本存储库()
{
dbStudentEntity=新学生实体();
}
}
数据存储库:
公共类CurrencyData:BaseRepository、ICurrencyData
{
公共列表GetCurrencyList()
{
var objcurrences=dbStudentEntity.currences.ToList();
List currencyList=新列表();
foreach(对象货币中的var项目)
{
var模型=新模型。货币{CurrencyId=item.CurrencyId,Currency1=item.Currency1,Code=item.Code,Symbol=item.Symbol,Country=item.Country};
currencyList.Add(模型);
}
退货清单;
}
}

如果您正在使用依赖项注入,您应该一直使用它,而不仅仅是在控制器中。

这意味着,DBContext应该被注入到存储库中,Ninject应该被配置为使用每个请求生存期解析DBContext。

如果您使用依赖项注入,那么您应该一直使用它,而不仅仅是在控制器中。

这意味着,DBContext应该被注入到存储库中,Ninject应该被配置为使用每个请求生存期解析您的DBContext。

根据@atika的回答,我进一步搜索并实现了他的建议(在整个应用程序中使用Ninject/DI,而不仅仅是在mvc的一个主要项目中使用)它解决了这个问题,我发布这个答案是为了添加更多细节和我面临的一些额外问题,我需要花时间在谷歌上进一步搜索,这样其他人可能会节省一些时间。


这个想法是在整个解决方案中使用依赖项注入,不管您有多少个项目/层,也不管您有多少个存储库

因此,问题的关键在于,如果我们想使用ninject或任何其他DI来绑定所有层/项目的所有依赖项,我们应该在主mvc项目中引用所有这些层/项目,这样我们就可以绑定NinjectWebCommons中的依赖项,但这将扼杀n层体系结构的全部用途。我们不想那样做 You can write one BaseRepository and implement BaseRepository in all repository classes. public class BaseRepository { public StudentEntities dbStudentEntity; public BaseRepository() { dbStudentEntity = new StudentEntities(); } } DataRepository : public class CurrencyData : BaseRepository,ICurrencyData { public List<Models.Currency> GetCurrencyList() { var objCurrencies = dbStudentEntity.Currencies.ToList(); List<Models.Currency> currencyList = new List<Models.Currency>(); foreach (var item in objCurrencies) { var model = new Models.Currency { CurrencyId = item.CurrencyId, Currency1 = item.Currency1,Code = item.Code,Symbol = item.Symbol,Country = item.Country }; currencyList.Add(model); } return currencyList; } }
using BLL.Repositories;
using BLL.RepositoryInterfaces;
using Ninject.Modules;
using Ninject.Web.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DAL;
using BOL;

namespace BLL
{
    public class LayerBindings : NinjectModule
    {
        public override void Load()
        {//add all references here like these
            Bind<AdDb>().ToSelf().InRequestScope();
            Bind<db_Entities>().ToSelf().InRequestScope().WithConstructorArgument("ConnectionString", BOL.CommonFunctionsBOL.ConnectionString);
        }
    }
}
//old bindings of BLL and local project.    
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope();
//now here we bind other dependencies of DAL etc using class we added in BLL
var modules = new List<INinjectModule>
{
      new BLL.LayerBindings()
};
kernel.Load(modules);
[Ninject.Inject]
private SomeDALObject db { get; set; }
((TypeOfObjectYouWant)System.Web.Mvc.DependencyResolver.Current.GetService(typeof(TypeOfObjectYouWant))).DoSomething();