通过WCF发送通用存储库的最佳方法是什么?

Tho*_*ker 11 c# generics wcf

我有一个像这样的存储库:

public abstract class DbRepository : IDbRepository
{
    public TEntity Insert<TEntity>(TEntity entity) where TEntity : class
    {
        _context.Entry(entity).State = EntityState.Added;
        return entity;
    }

    public TEntity Update<TEntity>(TEntity entity) where TEntity : class
    {
        _context.Entry(entity).State = EntityState.Modified;
        return entity;
    }
}
Run Code Online (Sandbox Code Playgroud)

服务合同如下:

[ServiceContract]
public interface IDbRepository
{
    [OperationContract]
    TEntity Insert<TEntity>(TEntity entity) where TEntity : class;
    [OperationContract]
    TEntity Update<TEntity>(TEntity entity) where TEntity : class;
}
Run Code Online (Sandbox Code Playgroud)

现在我知道我不能通过wcf发送这个,我必须使开放的泛型类关闭.但问题是我的域数据存储库中有很多实体,我希望它应该由客户端决定它所需要的实体可能是通过反射或预定义的已知类型.

所以我的问题是:有没有聪明或虚假的方式通过wcf发送这些泛型服务?我的目标是我不想为每个实体编写此服务合同.非常感谢.

编辑:伙计你在下面的app.config文件中看到过 这里 Tweak:

<endpoint 
    address="myAddress" binding="basicHttpBinding" 
    bindingConfiguration="myBindingConfiguration1"
    contract="Contracts.IEntityReadService`1[[Entities.mySampleEntity, Entities]],   Service.Contracts"  />
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这个合同是如何实施的.有没有人试图在app.config文件中实现这个调整.我已经尝试过,但现在还没有为我工作.需要帮助答案!

bat*_*wad 1

WCF 是否会为该合约生成 WSDL 并允许您托管该服务?您遇到的问题只是序列化和已知类型吗?如果是这样,您可能想查看这篇博文SharedTypeResolver中的内容。这是一个非常简单且很棒的魔法,它允许您透明地传递数据协定的任何子类,而无需声明它,只要该类型在客户端和服务器之间共享即可。

然后,您可以放弃泛型并简单地谈论事物TEntity。在服务内部,您可以将调用映射到通用服务实现;将 WCF 服务视为公开通用类的非通用外观。调用者将知道需要什么类型,因为他们首先将其提供给您,因此可以进行转换。如果转换有问题,您可以提供一个客户端,在其周围放置一个通用包装器。