C# MVVM ViewModel对通信和参数建模 背景
我想我已经找到了这个问题的答案,但我正努力尽可能地坚持MVVM,并从中学习了很多东西 我目前已设置视图、视图模型和模型。我的模型是使用实体框架查询数据库 我的视图有一组控件,允许用户设置查询的参数(基本上是构建一个大where子句)。ViewModel存储通过控件设置的这些选项 因此,我的视图模型交互似乎非常恰当,我认为这是可以接受的 问题 我的模型公开了一个函数,该函数将查询结果作为某种IEnumerable返回。我现在遇到的问题是我设置的“搜索条件”的数量。我现在有了模型函数的9参数。我不知道这是否可以接受。至少,它是丑陋的。非常难看。但是这样,我的viewModel只需要保存模型的一个实例,然后只需要知道一个函数及其签名 问题 我应该在模型中设置属性,然后在视图模型中设置这些属性吗?这样,单个函数将更加清晰,但视图模型必须更加“了解”模型的属性。我知道仅仅创建一些公共属性并没有什么大不了的,但我想知道哪个更适合MVVM。我们当前的代码库没有分离关注点。所以这次我只能靠自己了 有问题的代码 当前型号功能: 拟议模式: 我会说,“这取决于”,这些参数之间的联系有多紧密 如果可以将它们分成多个组,那么最好有多个功能。 e、 g.按时间范围、严重性、文本搜索等进行筛选 当它们明显属于一起时,创建一个类或结构来对它们进行分组并传递单个参数 想想其他“消费者”将来会如何使用你的模型,并根据这些模型做出决定,我会说,“这取决于”,这些参数之间的联系有多紧密 如果可以将它们分成多个组,那么最好有多个功能。 e、 g.按时间范围、严重性、文本搜索等进行筛选 当它们明显属于一起时,创建一个类或结构来对它们进行分组并传递单个参数C# MVVM ViewModel对通信和参数建模 背景,c#,wpf,mvvm,model,viewmodel,C#,Wpf,Mvvm,Model,Viewmodel,我想我已经找到了这个问题的答案,但我正努力尽可能地坚持MVVM,并从中学习了很多东西 我目前已设置视图、视图模型和模型。我的模型是使用实体框架查询数据库 我的视图有一组控件,允许用户设置查询的参数(基本上是构建一个大where子句)。ViewModel存储通过控件设置的这些选项 因此,我的视图模型交互似乎非常恰当,我认为这是可以接受的 问题 我的模型公开了一个函数,该函数将查询结果作为某种IEnumerable返回。我现在遇到的问题是我设置的“搜索条件”的数量。我现在有了模型函数的9参数。我不知
想一想其他“消费者”将来会如何使用您的模型,并在此基础上做出您的决策//据我所知,您的用例要求实现该模型。关于CQS的详细信息,您可以看到我的答案。现在,我们已经将此作为我们想法的基础,我们将检查下一步的重构步骤 论元洪水的重构 看到您的方法签名,我们可以清楚地看到您在这里有很多参数:
public IEnumerable<T> GetResults(string id, string inputName, DateTime? fromDate,
DateTime? toDate, bool option1, int selectCount,
bool exactMatch = true, bool showFailed = false)
将获得结果的顾虑分开
分离关注点,摆脱紧耦合模型和视图模型。可以找到关于查询的非常好和简要的介绍。我们创建一个示例查询处理程序,如下所示:
public class GetResultsQueryHandler
: IQueryHandler<FilterObject, YourModel>
{
public GetResultsQueryHandler([pass your needed dependencies here])
{
//set them to local variables
}
public YourModel Handle(FilterObject filterObject)
{
// Logic to call GetResults(filterObject) and return the filled model
}
}
然后,为了获得结果映射视图模型,映射操作可以按如下方式进行:
var viewModel = Mapper.Map<YourModel, YourViewModel>(model);
据我所知,您的用例要求实现。关于CQS的详细信息,您可以看到我的答案。现在,我们已经将此作为我们想法的基础,我们将检查下一步的重构步骤 论元洪水的重构 看到您的方法签名,我们可以清楚地看到您在这里有很多参数:
public IEnumerable<T> GetResults(string id, string inputName, DateTime? fromDate,
DateTime? toDate, bool option1, int selectCount,
bool exactMatch = true, bool showFailed = false)
将获得结果的顾虑分开
分离关注点,摆脱紧耦合模型和视图模型。可以找到关于查询的非常好和简要的介绍。我们创建一个示例查询处理程序,如下所示:
public class GetResultsQueryHandler
: IQueryHandler<FilterObject, YourModel>
{
public GetResultsQueryHandler([pass your needed dependencies here])
{
//set them to local variables
}
public YourModel Handle(FilterObject filterObject)
{
// Logic to call GetResults(filterObject) and return the filled model
}
}
然后,为了获得结果映射视图模型,映射操作可以按如下方式进行:
var viewModel = Mapper.Map<YourModel, YourViewModel>(model);
有几件事我会像你一样做:1。引入强类型参数对象以摆脱当前的9个参数,2。创建一个facade,其关注点是创建模型,传递GetResults()调用,3。通过自己的抽象将结果映射到viewmodel。+1到@kayess。另外,看看automapper,有几件事我会像你一样做:1。引入强类型参数对象以摆脱当前的9个参数,2。创建一个facade,其关注点是创建模型,传递GetResults()调用,3。通过自己的抽象将结果映射到viewmodel。+1到@kayess。我现在问这个问题感到很难过。“当它们明显属于一起时,创建一个类或结构来对它们进行分组并传递单个参数。”这似乎是一个非常好且简单的解决方案。谢谢你的提醒。我不知道为什么我没有想到这一点。我现在问这个问题感到很难过。“当它们明显属于一起时,创建一个类或结构来对它们进行分组并传递单个参数。”这似乎是一个非常好且简单的解决方案。谢谢你的提醒。我不知道为什么我没有想到这一点。每个人都推荐了这个对象,而不是数量荒谬的参数,这似乎是一个很好的方法。我将此标记为深入解释和参考其他来源的正确答案。谢谢。每个人都推荐了这个对象,而不是数量荒谬的参数,这似乎是一个很好的方法。我将此标记为深入解释和参考其他来源的正确答案。非常感谢。
public class FilterObject
{
public string id { get; set; }
public string inputName { get; set; }
...
}
public class GetResultsQueryHandler
: IQueryHandler<FilterObject, YourModel>
{
public GetResultsQueryHandler([pass your needed dependencies here])
{
//set them to local variables
}
public YourModel Handle(FilterObject filterObject)
{
// Logic to call GetResults(filterObject) and return the filled model
}
}
public static void Configure()
{
Mapper.CreateMap<YourModel, YourViewModel>();
}
var viewModel = Mapper.Map<YourModel, YourViewModel>(model);
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<YourModel, YourViewModel>();
});
var mapper = config.CreateMapper();