我创建了一个WCF service
负责公开我的数据库的数据,因为我不希望数据库被我的应用程序直接访问(出于安全原因),我需要能够与第三方应用程序共享数据。
我的解决方案是这样结构的:WPF application
-> WCFService library
-> DataAccessLayer library
。(箭头定义了程序集依赖关系'depends on')
为了实现WCF service
,我考虑简单地从服务返回detached EntityFramework objects
,但它迫使主应用程序依赖于DataAccessLayer库。
我可以解决的唯一方法是生成POCO objects
并使用它们通过电线发送它们,但现在我必须来回映射值EntityFramework.
此刻,我通过T4 template
动态地生成POCO
s,我使用AutoMapper
来来回映射EntityFramework
的值。
Wcf服务只需要实现存储库模式来公开数据。
这是一个好的解决方案吗?还有其他选择吗?有什么缺点需要我注意吗?
根据您的约束条件,我不得不同意这个解决方案。
我创造了一个几乎相同的解决方案,尽管我们的动机略有不同。我们的客户端是Delphi Win32,当时对JSON没有很好的支持,所以我们不得不使用SOAP。
客户端也不支持可空的原语,所以poco删除了所有不支持的类型,并执行了其他更改以确保互操作性,然后我们使用Automapper自定义映射来处理双向转换。
所有WCF服务(契约和实现)也由T4模板生成,使用通用存储库。使用T4模板,我能够为每个表生成用于CRUD操作的单独WCF服务,然后手动创建特定于业务的WCF服务。
最后,我还能够使用T4模板来生成与SOAP服务交互的Delphi存储库。
或
您可以轻松地将POCOs(和代码生成)移动到单独的项目中,更改DataAccessLayer库以引用POCOs库,并仅包含由POCOs的dbset组成的Db上下文和数据访问逻辑,但不包含实体(现在是POCOs)。您的客户端将不需要依赖于DataAccessLayer库。
所以…这是一个很好的解决方案,取决于您的约束。