Как вернуть несколько типов данных в C # - PullRequest
0 голосов
/ 29 июня 2018

Я возвращаю различные экземпляры службы в зависимости от перечисления в моем приложении:

public (????) CurrentService
{
    get
    {
        switch (CurrentServiceEnum)
        {
            case ServiceType.ServiceA:
                return IoC.ServiceA;
            case ServiceType.ServiceB:
                return IoC.ServiceB;
            case ServiceType.ServiceC:
                return IoC.ServiceC;
        }
    }
}

Каждый из этих сервисов имеет собственную реализацию метода RemoveAccount, принимающую другой аргумент типа .

internal class ServiceA_AccountDataModel { [..] }
internal class ServiceB_AccountDataModel { [..] }
internal class ServiceC_AccountDataModel { [..] }

public class ServiceA {
    public void RemoveAccount(ServiceA_AccountDataModel model) { [...] }
}
public class ServiceB {
    public void RemoveAccount(ServiceB_AccountDataModel model) { [...] }
}
public class ServiceC { 
    public void RemoveAccount(ServiceC_AccountDataModel model) { [...] }
}

То, чего я хочу достичь здесь, - это возможность вызова метода RemoveAccount отдельно от текущей службы, возвращенной таким образом, чтобы при передаче account из ServiceC_AccountDataModel значение автоматически разрешалось до IoC.ServiceC.

// account is an instance of ServiceC_AccountDataModel so it should assume that CurrentService is the instance of ServiceC
CurrentService.RemoveAccount(account); 

Есть ли способ достичь чего-то подобного в C #?

1 Ответ

0 голосов
/ 29 июня 2018

Один из способов достижения этого - для всех служб реализовать общий интерфейс:

public interface IAccountRemovalService<T>
{
    void RemoveAccount<T>(T model);
}

public class ServiceA : IAccountRemovalService<ServiceA_AccountDataModel>
{
    public void RemoveAccount<ServiceA_AccountDataModel>(ServiceA_AccountDataModel model) 
    { 
    }
}

public class ServiceB : IAccountRemovalService<ServiceB_AccountDataModel>
{
    public void RemoveAccount<ServiceB_AccountDataModel>(ServiceA_AccountDataModel model) 
    { 
    }
}

Чтобы это работало, вам нужно что-то общее между каждым из типов вашей модели, например базовый класс, такой как AccountModelDataBase:

public class ServiceA_AccountDataModel : AccountDataModelBase {}

public class AccountDataModelBase {}

Как только вы это получите, становится возможным переписать ваше свойство CurrentService следующим образом:

public IAccountRemovalService<AccountDataModelBase> CurrentService
{
    get
    {
        IAccountRemovalService<AccountDataModelBase> returnedValue = null;
        switch (CurrentServiceEnum)
        {
            case ServiceType.ServiceA:
                returnedValue = IoC.ServiceA as IAccountRemovalService<AccountDataModelBase>;
                break;
            case ServiceType.ServiceB:
                returnedValue = IoC.ServiceB as IAccountRemovalService<AccountDataModelBase>;
                break;
            case ServiceType.ServiceC:
                returnedValue = IoC.ServiceC as IAccountRemovalService<AccountDataModelBase>;
                break;
        }
        return returnedValue;
    }
}

Это включает в себя довольно много изменений в вашем коде, добавление интерфейса и базового класса, но это дает вам некоторое преимущество, поскольку теперь вы можете гарантировать (благодаря добавлению новых членов в IAccountRemovalService), что все ваши Реализации службы, которые имеют метод RemoveAccount, остаются в состоянии блокировки по отношению к методам, которые они реализуют.

Одна небольшая заметка о том, что свойство, которое вы включаете, называется CurrentServiceEnum, не совсем правильно из-за суффикса Enum, которое, вероятно, стоит рассмотреть, но это просто мое мнение! =)

...