我一直在努力决定如何在我的MVC解决方案中处理ViewModel。我认为,在阅读不同的帖子和博客后,最好的方法是让构建器实现一个接口,然后将它们注入控制器本身。
使用automapper我会在每个构建器的实现中执行实体和视图模型之间的映射,并且控制器将保持非常薄。
所以我创建了这个界面
public interface IViewModelBuilder<TViewModel, TEntity>
{
TViewModel Build(TEntity entity);
}
目前我忽略了关于使它们变得协变和逆变的警告(不知道是否需要它)。
对于特定的ViewModel,虽然我需要从两个不同的服务中获取两个实体,所以我不知道应该传递什么类型的参数。
public class ConcreteVMBuilder: IViewModelBuilder<concreteVM, ????>
也许那个界面不正确?
我知道合并控制器中提取的两个实体并不是一个干净的解决方案,对吗?
如果有人能帮助我,我将非常感激
答案 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:哦,我很难你回来了 - 忽略最后的评论!