MVC中ViewModel Builders的接口

时间:2013-04-14 19:53:35

标签: c# interface asp.net-mvc-viewmodel

我一直在努力决定如何在我的MVC解决方案中处理ViewModel。我认为,在阅读不同的帖子和博客后,最好的方法是让构建器实现一个接口,然后将它们注入控制器本身。

使用automapper我会在每个构建器的实现中执行实体和视图模型之间的映射,并且控制器将保持非常薄。

所以我创建了这个界面

public interface IViewModelBuilder<TViewModel, TEntity>
{
    TViewModel Build(TEntity entity);
}

目前我忽略了关于使它们变得协变和逆变的警告(不知道是否需要它)。

对于特定的ViewModel,虽然我需要从两个不同的服务中获取两个实体,所以我不知道应该传递什么类型的参数。

public class ConcreteVMBuilder: IViewModelBuilder<concreteVM, ????>

也许那个界面不正确?

我知道合并控制器中提取的两个实体并不是一个干净的解决方案,对吗?

如果有人能帮助我,我将非常感激

1 个答案:

答案 0 :(得分:4)

如何使injectable类型成为vm的嵌套类?

e.g。

之类的东西
public class SomeViewModelBuilder : IViewModelBuilder<SomeViewModelBuilderArgs>
{
    public class SomeViewModelBuilderArgs 
    {
        public SomeEntity Entity1 { get; private set; }
        public SomeOtherEntity Entity2 { get; private set; }

        public SomeViewModelBuilderArgs(Entity1 someEntity, Entity2 someOtherEntity) 
        {
            SomeEntity = someEntity;
            SomeOtherEntity = someOtherEntity;
        }
    }

    public SomeViewModel Build(SomeViewModelBuilderArgs)
    {
        // Do work
        return new SomeViewModel();
    }
}

然后调用标准接口注入实体:

builderInterface.Build(new SomeViewModelClass.SomeViewModelBuilderArgs(ent1, ent2));

这有帮助吗?

编辑:此外 - 是否需要第一个通用参数,因为界面甚至不使用它?

Edit2:哦,我很难你回来了 - 忽略最后的评论!