使用Dapper的Repository设计模式这应该是codereview的问题,不是StackOverflow。我正在使用DapperforMicroORM来检索数据并将其保存到SQLServer2014。我在DTOProj中有DTO类,它表示从DB检索或保存到DB的数据。我正在使用存储库模式,因此在我的服务层中,如果需要存储库,我会使用构造函数DI注入该依赖项,然后调用存储库上的方法来完成工作。假设有2个名为CustomerService和CarService的服务。然后,我有2个存储库,一个CustomerRepository和一个CarRepository。我有一个接口,它定义了每个存储库中的所有方法,然后是具体实现。示例方法如下所示(调用StoredProc执行DBINSERT(注意存储过程的实际字符串变量在类顶部定义为私有字符串):publicvoidSaveCustomer(CustomerDTOcustDTO){using(IDbConnectiondb=newSqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString)){db.Execute(saveCustSp,custDTO,commandType:CommandType.StoredProcedure);}}这一切都很好,但我发现自己在每个存储库的每个方法中重用阻止。我有两个真正的问题,如下所述。有没有更好的方法,我可能会以某种方式使用BaseRepository类,每个其他存储库继承,而Base将实现数据库连接的实例化?对于系统上的多个并发用户,这仍然可以正常工作吗?****更新****根据Silas的回答,我创建了以下公共接口IBaseRepository{voidExecute(Actionquery);}publicclassBaseRepository:IBaseRepository{publicvoidExecute(Actionquery){using(IDbConnectiondb=newSqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString)){query.Invoke(db);但是,在我的存储库中,我还有其他类似的方法:=db.ExecuteScalar(anotherStoredSp,new{CarID=carId,Year=year},commandType:CommandType.StoredProcedure);还车>0?真假;}}和publicIEnumerableGetEmployeeDetails(intemployeeId){使用(IDbConnectiondb=newSqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString)){returndb.Query(anotherSp,new{EmployeeID=employeeId},commandType:CommandType.StoredProcedure);将这些添加到我的通用类型T的基本存储库的正确方法是什么,这样我就可以返回任何类型的DTO或任何C#Native类型当然,创建和部署连接的功能非常有用protectedvoidExecute(Actionquery){使用(IDbConnectiondb=newSqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString)){query.Invoke(db);您的简化呼叫站点:publicvoidSaveCustomer(CustomerDTOcustDTO){Execute(db=>db.Execute(saveCustSp,custDTO,CommandType.StoredProcedure));}使用返回值:publicTGet(Funcquery){using(IDbConnectiondb=newSqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString)){returnquery.Invoke(db);在您的调用站点中,只需编写您要使用的逻辑即可。publicIEnumerableGetEmployeeDetails(intemployeeId){returnGet(db=>db.Query(anotherSp,new{EmployeeID=employeeId},CommandType.StoredProcedure));这与您的问题没有直接关系。但我建议你考虑使用DapperExtensions。最初,我确实使用Dapper实现了Repository模式。缺点是,我必须完整地编写查询;这很古怪。由于硬编码查询,编写通用存储库几乎是不可能的。最近,我升级了我的代码以使用DapperExtensions。这解决了很多问题。下面是通用存储库:publicabstractclassBaseRepositorywhereT:BasePoco{internalBaseRepository(IUnitOfWorkunitOfWork){dapperExtensionsProxy=newDapperExtensionsProxy(unitOfWork);}DapperExtensionsProxydapperExtensionsProxy=null;protectedboolExists(){返回(GetCount()==0)?假:真;}protectedintGetCount(){varresult=dapperExtensionsProxy.Count(null);返回结果;}protectedTGetById(Guidid){varresult=dapperExtensionsProxy.Get(id);返回结果;}protectedTGetById(stringid){varresult=dapperExtensionsProxy.Get(id);返回结果;}protectedListGetList(){varresult=dapperExtensionsProxy.GetList(null);返回结果.ToList();}protectedvoidInsert(Tpoco){varresult=dapperExtensionsProxy.Insert(poco);}protectedvoidUpdate(Tpoco){varresult=dapperExtensionsProxy.Update(poco);}protectedvoidDelete(Tpoco){varresult=dapperExtensionsProxy.Delete(poco);}受保护无效DeleteById(Guidid){Tpoco=(T)Activator.CreateInstance(typeof(T));poco.SetDbId(id);varresult=dapperExtensionsProxy.Delete(poco);}protectedvoidDeleteById(stringid){Tpoco=(T)Activator.CreateInstance(typeof(T));poco.SetDbId(id);varresult=dapperExtensionsProxy.Delete(poco);}protectedvoidDeleteAll(){varpredicateGroup=newPredicateGroup{Operator=GroupOperator.And,Predicates=newList()};varresult=dapperExtensionsProxy.Delete(predicateGroup);//发送空的predicateGroup删除所有记录。正如您在上面的代码中看到的,大多数方法只是DapperExtensionsProxy基类的包装器DapperExtensionsProxyUnitOfWork也在内部进行管理,您可以在下面看到。这两个类可以毫无问题地结合起来。我个人更喜欢将它们分开。您还可以注意到其他方法Exists、DeleteById和DeleteAll已实现,它们不是DapperExtensionsProxy的一部分。方法poco.SetDbId在每个POCO类中定义以设置其标识符属性。就我而言,POCO的标识符可能具有不同的数据类型和名称。下面是DapperExtensionsProxy:internalsealedclassDapperExtensionsProxy{internalDapperExtensionsProxy(IUnitOfWorkunitOfWork){this.unitOfWork=unitOfWork;}IUnitOfWorkunitOfWork=null;internalintCount(objectpredicate)whereT:BasePoco{varresult=unitOfWork.Connection.Count(predicate,unitOfWork.Transaction);返回结果;}internalTGet(objectid)whereT:BasePoco{varresult=unitOfWork.Connection.Get(id,unitOfWork.Transaction);返回结果;}internalIEnumerableGetList(objectpredicate,IListsort=null,boolbuffered=false)whereT:BasePoco{varresult=unitOfWork.Connection.GetList(predicate,sort,unitOfWork.Transaction,null,buffered);返回结果;}internalIEnumerableGetPage(objectpredicate,intpage,intresultsPerPage,IListsort=null,boolbuffered=false)whereT:BasePoco{varresult=unitOfWork.Connection.GetPage(predicate,sort,page,resultsPerPage,unitOfWork.Transaction,无效的,缓冲的);返回结果;}internaldynamicInsert(Tpoco)whereT:BasePoco{varresult=unitOfWork.Connection.Insert(poco,unitOfWork.Transaction);返回结果;}internalvoidInsert(IEnumerablelistPoco)whereT:BasePoco{unitOfWork.Connection.Insert(listPoco,unitOfWork.Transaction);}internalboolUpdate(Tpoco)whereT:BasePoco{varresult=unitOfWork.Connection.Update(poco,unitOfWork.Transaction);返回结果;}internalboolDelete(Tpoco)whereT:BasePoco{varresult=unitOfWork.Connection.Delete(poco,unitOfWork.Transaction);返回结果;}internalboolDelete(objectpredicate)whereT:BasePoco{varresult=unitOfWork.Connection.Delete(predicate,unitOfWork.Transaction);返回结果;}}以下是BasePoco使用的BasePoco:publicabstractclassBasePoco{GuidpocoId=Guid.NewGuid();publicGuidPocoId{get{返回pocoId;}}publicvirtualvoidSetDbId(objectid){//每个POCO都应该为sp重写这个方法ecificimplementation.thrownewNotImplementedException("此方法未由Poco实现。");}publicoverridestringToString(){returnPocoId+Environment.NewLine+base.ToString();}}这个也用到了UnitOfWork,上面解释的这里是C#学习教程:使用Dapper的repositorydesignpattern,分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
