MVP,泛型和DRY

时间:2010-08-28 15:57:15

标签: c# generics mvp dry

我的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作为模型,我不关心什么类型的模型(泛型)。一种解决方案是删除模型的通用约束,但是我无法创建我想要的通用Model类层次结构。

我对整个MVP /仿制品的想法是错误的吗?

1 个答案:

答案 0 :(得分:3)

在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. 制作模型基类
  4. 使用where TModel : Model
  5. 模型本身对于定义不依赖于TModelType的接口方法很有用。