跨多个服务和 .net 版本重用类型

Posted

技术标签:

【中文标题】跨多个服务和 .net 版本重用类型【英文标题】:Reusing types across multiple services and .net versions 【发布时间】:2019-10-11 22:06:37 【问题描述】:

我有服务 (Service1, Service2, ...) 所有引用 Common.dll 的所有这些都在 .Net 4.0 中,我无法重用消费者中的类型服务。


Common.dll 有

Identifier 
    int Id;
    string Type;

每个服务实现

byte[] Get(Common.Identifier);
string Test();

服务的消费者(.Net3.5)在reference.cs中生成代码

class Service1 
    byte[] Get(Service1.Identifier);
    string Test();  


class Service2 
    byte[] Get(Service2.Identifier);
    string Test();  


我通过创建一个接口将它们联系在一起 将接口添加到部分类,但只能让它为 Test() 调用工作

public interface IService 
    //byte[] Get(Service2.Identifier);
    string Test();  


public partial class Service1 : IService;
public partial class Service2 : IService;

这样我可以互换使用这些服务。 我计划创建更多作为基本插件使用以集成到不同的系统

IService GetService(string provider) 
    switch (provider) 
        case "Service1":
            return (IService)new Service1();

        case "Service2":
            return (IService)new Service2();
    


GetService.Test() //works perfectly.

我的问题是如何定义、装饰“标识符”,使我无需编写大量代码即可使用 Get(?? Identifier)。

我现在唯一能想到的方法就是创建一个接口IIdentifier,然后添加到部分类中

public partial class Service1 : IService 
    byte[] Get(IIdentifier id) 
        return this.Get(new Service1.Identifier()  Id = id.Id, Type = id.Type);

但是有很多电话,我不想把它们都包装起来。我确定我只是缺少一些简单的东西,感谢您提供的任何帮助。

【问题讨论】:

“每个服务都实现了byte[] Get(Identifier);”,但代码显示做了一些不同的事情——byte[] Get(Service1.Identifier);。您能否澄清问题是“为什么我不在Get 方法中使用Identifier”或“如何允许Identifier 类的鸭子类型与具有相同属性的其他类型相匹配”或其他什么.. . 重新阅读minimal reproducible example 关于发布代码的指导,因为到目前为止帖子中提供的内容与帖子所说的内容和代码显示的内容不一致。 在服务本身中,它们实现了 byte[] Get(Common.Identifier),在服务的消费者中,生成的参考代码是 byte[] Get(Service1.Identifier),这就是原因我试图解决的问题。 @AlexeiLevenkov 经过一番研究后,看起来我正在寻找“如何允许标识符类的鸭子类型与具有相同属性的其他类型相匹配”看起来它适用于.net4.0,我使用服务的代码是 .net3.5。 【参考方案1】:

我是从错误的角度来处理这个问题的,而我试图这样做的方式不会像 Alexei 指出的那样起作用。

通过为 .net 3.5 而不是 4.0 编译 common.dll,我设法让一切正常工作并重用 common.dll 中的类。

.Net 4.0 向后兼容 3.5,因此我能够从我的服务中引用 3.5 common.dll,这允许我的 3.5 代码引用 common.dll,从而重用这些类型。

【讨论】:

以上是关于跨多个服务和 .net 版本重用类型的主要内容,如果未能解决你的问题,请参考以下文章

跨多个模型导出和重用我的猫鼬连接

跨多个模型导出和重用我的猫鼬连接

跨多个 UICollectionViewController 重用 UICollectionView

“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用

在没有符号链接的情况下跨服务重用数据存储模型

跨脚本重用/共享powershell远程会话