Лучшая модель проектирования для реализации в конкретной стране - PullRequest
0 голосов
/ 24 мая 2018

В нашем приложении у нас есть общая база кода для страны X, теперь мы добавляем поддержку страны Y, используя полиморфизм.

Давайте рассмотрим этот пример:

public abstract class GradeListModelBase
{
    public abstract void CalculateGrade();

    public virtual IEnumerable<dynamic> GetGrade()
    {
         //logic to get grade common for X and Y country.
    }
}

public class GradeListModelForX : GradeListModelBase
{
    public override void CalculateGrade()
    {
         //logic to get grade for X
    }
}

public class GradeListModelForY : GradeListModelBase
{
    public override void CalculateGrade()
    {
         //logic to get grade for Y
    }
}

public class GradeController : Controller
{
    public ActionResult List(GradeListModelBase model)
    {
         model.CalculateGrade();
         model.GetGrade();
         return View("List", model)
    }
}

Теперь я хочучтобы добиться этого, когда GradeController вызывается для страны X, ListModelFor X должен вводиться и то же самое для страны Y. У меня есть контекст, из которого я могу найти, в какой стране он находится, однако я не хочу везде сохранять логику if-elseпри введении моделей.

Есть ли лучший подход для решения этой проблемы?Шаблон дизайна?Любое предложение, которое могло бы помочь.

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете следовать фабричному подходу,

Создать фабрику для GradeListModel

public interface IGradeListModelFactory{
      GradeListModelBase GetGradeListModel(string country);
}

public class GradeListModelFactory : IGradeListModelFactory
{
    public GradeListModelBase GetGradeListModel(string country){
        GradeListModelBase gradeListModelBase = null;
        switch(country){
            case "x":
                    gradeListModelBase = new GradeListModelForX();
                break;
            case "y":
                    gradeListModelBase = new GradeListModelForY();
                break;
        }
        return gradeListModelBase;
    }
}

Вы можете получить экземпляр из сервисного локатора вместо его инициализации, в этом случае вам нужночтобы внедрить экземпляр локатора службы на фабрике

Теперь зарегистрируйте IGradeListModelFactory в контейнере IOC и вставьте его в контроллер,

public class GradeController : Controller
{
    private readonly IGradeListModelFactory _gradeListModelFactory;
    public GradeController(IGradeListModelFactory gradeListModelFactory){
        _gradeListModelFactory = gradeListModelFactory;
    }

    public ActionResult List()
    {
        string country = // identify country
        GradeListModelBase model = _gradeListModelFactory.GetGradeListModel(country);

         model.CalculateGrade();
         model.GetGrade();
         return View("List", model)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...