我今天写了一些代码,有点味道。
public class SomeController : GenericController<SomeViewModel, SomeModel>
这是一个受限于特定模型和视图模型的通用控制器;现在闻起来的事实是,我正在定义模型和视图模型之间的关系,我不介意控制器知道视图模型,这很好。我希望这样做是让控制器以某种方式询问视图模型,因为这就是我认为耦合的地方。我能想到的唯一方法是在控制器工厂。这可以检查提供的 ViewModel 并使用在运行时定义的模型创建控制器的实例。
所以上面会变成
public class SomeController : GenericController<SomeViewModel, TModel> where TModel : Model
并且只能在运行时输入。关于如何做到这一点的任何想法?反射?仿制药?属性?或者这只是一个非常糟糕的主意?
============编辑===========
使用泛型的原因是整个控制器中有很多共享代码,控制器使用实习生使用存储库的服务。服务和存储库取决于域对象的类型。通用控制器中的方法public ViewResultBase Add(TViewModel viewModel)
使用通用映射器,它将 ViewModel 转换为模型并将其传递给服务 -> 存储库。
============编辑===========
这是基类中的一个片段,显示了一些使用通用参数的共享代码
[HttpGet]
public virtual PartialViewResult List(int id)
{
var model = BuildListDetails(id);
return PartialView(model);
}
[Dependency]
public IService<TDomainObject> Service { get; set; }
protected IEnumerable<TViewModel> BuildListDetails(int id)
{
var nodes = Service.GetData(UserState.Current.User.UserID, id);
if (nodes == null) return null;
return nodes.Select(n => ModelMapperFactory<TDomainObject, TViewModel>.Instance.Create(n)).AsEnumerable();
}
干杯,