我想在WCF中使用继承的类型,但我不想在基类中添加所有类型的KnownType属性,因为基在另一个程序集中,也是为了避免依赖关系。 那么,还有什么其他方法可以实现这一目标呢?
我认为至少有两种方法可以做到这一点。
-
您可以创建自己的类 (DTO( 并将数据从其他程序集映射到您的类。对于映射,您可以使用自动映射器。它具有以下优点:
- 您的通信层与您的逻辑分离(我假设另一个程序集包含逻辑(
- 您将决定您的 API 的外观,并且您的协议不会在您不知情的情况下更改(我在这里假设另一个程序集是一个库或其他人负责它(。
-
您可以或多或少地将
ServiceKnownType
添加到您的服务合约界面中,如下所示(我没有测试代码(:[DataContract] public class BaseClass {} [DataContract] public class DerivedClass : BaseClass {} [ServiceKnownType(typeof(BaseClass))] [ServiceKnownType(typeof(DerivedClass))] [ServiceContract()] public interface IYourContract { [OperationContract] BaseClass[] GetClasses(); }
有关更多信息,请查看此处的文档。确实有很好的例子。
哪个是贝特?
这取决于你需要什么。如果您正在开发原型,或者您需要快速做一些事情,请选择选项 2。如果您需要更可靠的解决方案,请选择选项 1。
还有更多指定已知类型的方法。其中之一是将它们放在您的配置文件中。这样,您的服务在编译时就不知道它们。但是为了序列化它们,它必须在运行时了解它们。