【发布时间】:2012-09-21 06:48:57
【问题描述】:
我有一个 WCF 数据服务层,它公开 POCO T4 模板生成的 POCO 实体。这些 POCO 实体是在他们自己的项目(即 Company.ProjectName.Entities)中创建的,因为我想尽可能地分享它们。
我在另一个项目 (Company.ProjectName.Clients) 中有一组接口,它们通过添加对 Company.ProjectName.Entities.dll 的程序集引用来引用这些 POCO 类型。这些接口的实现之一是一个 .NET 客户端,我想使用 WCF 数据服务客户端库来使用该服务。
我已使用添加服务引用来添加服务引用。这会生成服务使用的 DataServiceContext 客户端类和 POCO 实体。但是,添加服务引用实用程序生成的这些 POCO 类型现在具有不同的命名空间(即 Company.ProjectName.Clients.Implementation.WcfDsReference)。
这意味着接口中定义的 POCO 类型不能被实用程序生成的类型使用,而无需强制转换或映射。
即假设我有:
1. POCO Entity: Company.ProjectName.Entities.Account
2. Interface: interface IRepository<Company.ProjectName.Entities.Account>{....}
3. Implementation: ServiceClientRepository : IRepository<Company.ProjectName.Entities.Account>
4. WcfDsReference: Company.ProjectName.Clients.Implementation.WcfDsReference
& Company.ProjectName.Clients.Implementation.WcfDsReference.Account
Let's say I want to create a DataServiceQuery query on the Account, I won't be able to do this:
var client = new WcfDsReference(baseUrl);
var accounts = client.CreateQuery<Company.ProjectName.Entities.Account>(...)
OR: client.AddToAccounts(Company.ProjectName.Entities.Account)
, because the CreateQuery<T>() expects T to be of type & Company.ProjectName.Clients.Implementation.WcfDsReference.Account
我目前要做的是将正确的实体传递给 CreateQuery 方法,并且必须将结果映射回接口可以理解的类型。 (可以使用映射器,但似乎不是一个好的解决方案。)
所以问题是,有没有办法让“添加服务引用”实用程序生成使用 Company.ProjectName.Entities 命名空间中的 POCO 类型的方法?
我正在考虑的一个解决方案是不使用该实用程序来生成 DataServiceContext 和其他类型,而是创建我自己的。
另一个解决方案是更新IRepository<T> 接口以使用该实用程序生成的POCO 类型。但这听起来有点老套。
有没有人提出过更好的解决方案或者有什么建议?
【问题讨论】:
-
+1 我也很想知道这个。
-
在您执行添加服务引用的客户端项目中,添加 Company.ProjectName.Entities.dll 作为引用。现在启动“添加服务引用”实用程序并尝试生成代理。默认情况下,“添加服务引用”将重用引用程序集中定义的类型,导致您的客户端代理代码不重新定义 POCO 类型,而是直接从 Company.ProjectName.Entities.dll 使用它们。
标签: wcf service reference poco