C# 实体对象是否应该由存储库公开?

C# 实体对象是否应该由存储库公开?,c#,oracle,entity-framework,repository,repository-pattern,C#,Oracle,Entity Framework,Repository,Repository Pattern,我有一个实现interfaceIRepository的存储库。存储库(代表)应用程序对实体框架执行查询,并直接返回生成的实体对象 实现IRepository的关键在于,将来可以将它切换到不同的存储库。但是,返回实体框架返回的确切实体对象将打破这一点。这可以接受吗 因此,在向应用程序公开所有实体框架对象之前,存储库是否应该将其转换为业务对象?这些对象应该实现接口还是具有公共基类型?您应该考虑使用一个POCO模板来生成实体。这样,您的实体对实体框架没有特殊的依赖关系,并且可以在层之间自由传递。与维护

我有一个实现interface
IRepository
的存储库。存储库(代表)应用程序对实体框架执行查询,并直接返回生成的实体对象

实现
IRepository
的关键在于,将来可以将它切换到不同的存储库。但是,返回实体框架返回的确切实体对象将打破这一点。这可以接受吗


因此,在向应用程序公开所有实体框架对象之前,存储库是否应该将其转换为业务对象?这些对象应该实现接口还是具有公共基类型?

您应该考虑使用一个POCO模板来生成实体。这样,您的实体对实体框架没有特殊的依赖关系,并且可以在层之间自由传递。与维护一个完全独立的域模型和两者之间的映射相比,它节省了大量的工作(除非域模型与实体模型有很大的不同,在这种情况下,它会更有意义)。

如果您使用的是POCO实体,您可以假设任何提供者都会做类似的工作。另外,请记住,您正在返回实体,这些实体的属性映射到数据库。因此,您可以假设,除非实体对每个提供者都有不同的属性名称(我找不到具有不同名称的逻辑解释),否则您可以直接将它们从存储库返回到业务。

存储库接口应该只处理业务/域实体,也就是说,存储库只发送和接收应用程序已知的对象,即与底层peristence访问实现无关的对象

EF或Nhibernate实体正在对持久性数据进行建模,而不是对域数据进行建模。因此,IRepository不应返回ORM实现细节的对象,而应返回可由应用程序直接使用的对象(域实体或简化视图模型,具体取决于操作)

在存储库实现中,您需要处理ORM实体,这些实体将映射到相应的应用程序实体(通常使用诸如AutoMapper之类的映射器)。长话短说,在设计IRepository时,请忘记它的实现。这就是为什么在决定是否使用/使用什么ORM之前,最好先设计接口


基本上,存储库是应用程序域上下文和Persience上下文之间的网关,应用程序不应与存储库的实现细节耦合

您希望支持哪些“不同的存储库”。你是说从EF换成NHibernate?如果是这样的话,您可能会遇到比IRepository接口多得多的更改。我没有特别考虑任何事情,但我希望我的应用程序是健壮的。你还想做些什么改变?