Повторное использование типов в нескольких сервисах и версиях .net - PullRequest
1 голос
/ 25 мая 2019

У меня есть службы (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});
}

но звонков много, и мне не нужно их оборачивать. Я уверен, что просто упускаю что-то простое, спасибо за любую помощь, которая может быть предоставлена.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Я подходил к этому не с той стороны, и способ, которым я пытался это сделать, не сработал, как указал Алексей.

Мне удалось заставить все работать и повторно использовать классы в общем.dll путем компиляции для .net 3.5 вместо 4.0.

.Net 4.0 обратно совместим с 3.5, поэтому я смог сослаться на 3.5 common.dll из моих служб, что позволило моему коду 3.5 ссылаться на common.dll и, таким образом, повторно использовать типы.

0 голосов
/ 26 мая 2019

C # не предоставляет возможности использовать разные типы в качестве одного и того же типа, даже если члены идентичны в вашем конкретном случае. Чтобы исправить это, вам нужно будет либо переписать ваши сервисы, чтобы они использовали общий класс, либо сопоставить классы друг с другом, возможно, добавив методы расширения, чтобы код выглядел так, как будто Get принимает тот же тип.

Если вам не нужно передавать уникальные параметры, а просто вызывать не виртуальный / неинтерфейсный метод, вы могли бы использовать dynamic (dynamic service = ....; service.Get();), который наиболее близок к типу утки, как вы можете получить здесь.

...