0

我今天写了一些代码,有点味道。

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();
    }

干杯,

4

1 回答 1

0

达林是对的(一如既往)。控制器可以使用不同的模型和不同的视图以及不同的视图模型。将控制器键入到一个特定的视图模型和模型是没有意义的,除非您知道您将始终只使用一个视图模型和一个模型。

视图模型和模型之间存在关联。此关联在控制器中处理。这是它的目的之一。不要花太多精力尝试通用化控制器,它们通常只包含与其使用相关的非常具体的代码,并且几乎没有可重用的选项。当您确实需要更多选项时,请考虑使用仅抽象可重用部分的方面或基类(有些人在基类中进行身份验证逻辑,我不同意……但这是一种选择……其他人添加自己的自定义IPrincipal 或其他类型的通用特性。在大多数情况下,这不需要使用泛型)。

于 2012-04-25T15:34:51.713 回答