MVP, дженерики и СУХОЙ - PullRequest
       15

MVP, дженерики и СУХОЙ

2 голосов
/ 28 августа 2010

У меня проблема с моей структурой MVP, которая основана на общих докладчиках, представлениях и т. Д., И я чувствую, что нарушаю DRY, и я не знаю, как обойти это.

Пример.

public class Presenter<TView, TModel>
  where TView : IView
  where TModel : Model
{}

Пока все хорошо, но я хочу, чтобы это было так

public class Presenter<TView, TModel>
  where TView : IView
  where TModel : Model
{}

public class Model<T>
{
  public T Value { get;set; }
}

Но это не скомпилируется, потому что для Model требуется универсальный параметр. Исправление:

public class Presenter<TView, TModel, TModelType>
      where TView : IView
      where TModel : Model<TModelType>
    {}

И я чувствую, что нарушаю всухую, например

public class MyPresenter : Presenter<IMyView, MyModel, string>
{}

public class MyModel : Model<string>
{}

Мне неловко указывать тип струны дважды: у ведущего и у модели, Я только не хочу указывать, что докладчик использует MyModel в качестве модели, мне все равно, какой тип модели (дженерики). Одно из решений состоит в том, чтобы удалить общее ограничение для модели, но тогда я не могу создать общую иерархию классов модели, которую я хочу.

Не думаю ли я обо всем, что связано с MVP / дженериками?

1 Ответ

3 голосов
/ 28 августа 2010

В C ++ это можно решить с помощью typedef, которого в C # на самом деле нет.

public class Model<T>
{
   typedef T TModelType; // this doesn't exist in C#
   public T Value { get;set; }
}

Тогда

 public class Presenter<TView, TModel>
  where TView : IView
  where TModel : Model<TModel::TModelType>
{}

Существует псевдоним типа, который вы можете использовать с помощью

using NewName = any_type<even_generics<with_generics>>

Но он основан на файлах - его нельзя использовать в классе.

Я бы, наверное, сделал это так

  1. переименовать Model<T> в ModelOf<T>
  2. Создание базового класса для модели ModelOf<T> (ModelOf<T> : Model)
  3. Использование where TModel : Model

Сама модель будет полезна для определения методов интерфейса, которые не зависят от TModelType.

...