当前位置: 首页 > 编程语言 > C#

用自定义DbSet-IDbSet包装DbSet?分享

时间:2023-04-10 22:51:28 C#

用自定义DbSet/IDbSet包装DbSet?起初我觉得这样做有点荒谬,但我团队的其他人坚持认为除了“我认为这是愚蠢的”之外我无法提出一个好的论据来反对它......我们要做什么要做的就是创建一个完全抽象的数据层,然后是那个数据层的各种实现。很简单吧?进入实体框架4.1...我们的最终目标是程序员(我尽力只留在数据层)永远不想接触具体的类。除了明显需要实例化工厂外,他们只想在代码中使用接口。我想实现以下目标:首先我们拥有所有接口的“Common”库,我们称之为“Common.Data”:publicinterfaceIEntity{intID{get;放;}}publicinterfaceIUser:IEntity{intAccountID{get}stringUsername{get;放;}stringEmailAddress{得到;放;}IAccount帐户{得到;放;}}publicinterfaceIAccount:IEntity{stringFirstName{get;放;}stringLastName{得到;放;}DbSet用户{得到;放;}//或IDbSet或[IDbSet实现]?}publicinterfaceIEntityFactory{DbSetUsers{get;}DbSet账户{get;从那时起,我们就有了一个实现库,我们称之为“Something.Data.Imp”:internalclassUser:IUser{publicintID{get;放;}publicstring用户名{get;放;}publicstringEmailAddress{get;放;}publicIAccount账户{get;放;}publicclassConfiguration:EntityTypeConfiguration{publicConfiguration():base(){...}}}internalclassAccount:IAccount{publicintID{get;放;}publicstringFirstName{get;放;}publicstringLastName{get;等;}公共DbSet用户{得到;放;}//或IDbSet或[IDbSet实现]?publicclassConfiguration:EntityTypeConfiguration{publicConfiguration():base(){...}}}厂:publicclassImplEntityFactory:IEntityFactory{privateImplEntityFactory(stringconnectionString){this.dataContext=newMyEfDbContext(connectionString);}私有MyEfDbContext数据上下文;publicstaticImplEntityFactoryInstance(stringconnectionString){if(ImplEntityFactory._instance==null)ImplEntityFactory._instance=newImplEntityFactory(connectionString);返回ImplEntityFactory._instance;}私有静态ImplEntityFactory实例;publicDbSetUsers//ORIDbSetOR[IDbSetimplementation]?{得到{返回dataContext.Users;}}publicDbSetAccounts//ORIDbSetOR[IDbSetimplementation]?{得到{返回dataContext.Accounts;}}}语境:publicclassMyEfDataContext:DbContext{publicMyEfDataContext(stringconnectionString):base(connectionString){Database.SetInitializer(null);}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){modelBuilder.Configurations.Add(newUser.Configuration());modelBuilder.Configurations.Add(newAccount.Configuration());根据。OnModelCreating(模型构建器);}公共DbSet用户{得到;放;}公共DbSet帐户{get;放;}}那么前端程序员就会用到,eg:publicclassUsingIt{publicstaticvoidMain(string[]args){IEntityFactoryfactory=newImplEntityFactory("SQLConnectionString");IUseruser=factory.Users.Find(5);IAccountusersAccount=user.Account;IAccount账户=factory.Accounts.Find(3);Console.Write(account.Users.Count());所以在这里......我希望这里有人可以指出我正确的方向,或者帮助我提出一个很好的论据来反击开发团队我在这个网站上看到了一些其他文章,关于EF可以不使用接口和回复说你不能实现IDbSet(我觉得有点奇怪,如果你不能实现它,为什么他们提供它?)但到目前为止无济于事。在此先感谢您的帮助!带接口的EF不使用j第一个参数。必须使用实体实现来定义DbSet。第二个参数是你的实体不应该包含DbSet-这是上下文相关的类,你的实体应该是一个纯粹的依赖,除非你正在实现活动记录模式。即使在这种情况下,您也绝对不能访问另一个实体中不同实体的DbSet。即使你设置了,你仍然离EF太近了,实体永远不会有访问另一个实体类型的所有实体的属性(不仅仅是那些与当前实例相关的实体)。只是为了清楚一点,EF中的DbSet具有非常特殊的含义-它不是集合。它是数据库的入口点(例如,DbSet上的每个LINQ查询都会访问数据库),并且在正常情况下它不会在实体上公开。第三个参数是每个应用程序使用一个上下文——每个单例工厂只使用一个私有实例。这绝对是错误的,除非你正在做一些单次运行的批处理。最后一个论点很简单。您付费是为了提供功能,而不是将时间浪费在不会给您(和您的客户)带来任何商业价值的抽象上。这并不是要证明为什么你不应该创建这种抽象。这是为了证明你为什么要这样做。使用它你能获得什么价值?如果你的同事不能提出具有商业价值的论点,你可以去找你的产品经理,让他使用他的权力——他掌握着预算。通常,抽象是设计良好的面向对象应用程序的一部分——这是正确的。但是:什么时候进行“大量”抽象才有意义?如果您只使用目标应用程序(主要是按需的单一用途应用程序或外包解决方案),您应该只在必要时使用抽象。这些应用程序是成本驱动的——目标是在尽可能短的时间内以最低的成本提供可行的解决方案。即使内部制作的应用程序不是很好,也必须实现这一点——唯一重要的是应用程序是否符合要求。任何基于“如果......会发生什么”或“也许我们需要......”的抽象都会增加永远不会发生的虚拟(不存在)需求的成本,并且在大多数情况下与客户的初始合同有关不考虑此类额外费用。顺便一提。这种类型的应用程序是MSAPI和设计人员策略的目标——MS将有许多设计人员和代码生成器创建非最佳但廉价且快速的解决方案,这些解决方案可以由技能较低且非常廉价的人创建。最后一个例子是LightSwitch。以上是C#学习教程:WrapDbSetwithcustomDbSet/IDbSet?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: