Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM ViewModel对通信和参数建模 背景_C#_Wpf_Mvvm_Model_Viewmodel - Fatal编程技术网

C# MVVM ViewModel对通信和参数建模 背景

C# MVVM ViewModel对通信和参数建模 背景,c#,wpf,mvvm,model,viewmodel,C#,Wpf,Mvvm,Model,Viewmodel,我想我已经找到了这个问题的答案,但我正努力尽可能地坚持MVVM,并从中学习了很多东西 我目前已设置视图、视图模型和模型。我的模型是使用实体框架查询数据库 我的视图有一组控件,允许用户设置查询的参数(基本上是构建一个大where子句)。ViewModel存储通过控件设置的这些选项 因此,我的视图模型交互似乎非常恰当,我认为这是可以接受的 问题 我的模型公开了一个函数,该函数将查询结果作为某种IEnumerable返回。我现在遇到的问题是我设置的“搜索条件”的数量。我现在有了模型函数的9参数。我不知

我想我已经找到了这个问题的答案,但我正努力尽可能地坚持MVVM,并从中学习了很多东西

我目前已设置视图、视图模型和模型。我的模型是使用实体框架查询数据库

我的视图有一组控件,允许用户设置查询的参数(基本上是构建一个大where子句)。ViewModel存储通过控件设置的这些选项

因此,我的视图模型交互似乎非常恰当,我认为这是可以接受的

问题 我的模型公开了一个函数,该函数将查询结果作为某种IEnumerable返回。我现在遇到的问题是我设置的“搜索条件”的数量。我现在有了模型函数的9参数。我不知道这是否可以接受。至少,它是丑陋的。非常难看。但是这样,我的viewModel只需要保存模型的一个实例,然后只需要知道一个函数及其签名

问题 我应该在模型中设置属性,然后在视图模型中设置这些属性吗?这样,单个函数将更加清晰,但视图模型必须更加“了解”模型的属性。我知道仅仅创建一些公共属性并没有什么大不了的,但我想知道哪个更适合MVVM。我们当前的代码库没有分离关注点。所以这次我只能靠自己了

有问题的代码 当前型号功能: 拟议模式: 我会说,“这取决于”,这些参数之间的联系有多紧密

如果可以将它们分成多个组,那么最好有多个功能。 e、 g.按时间范围、严重性、文本搜索等进行筛选

当它们明显属于一起时,创建一个类或结构来对它们进行分组并传递单个参数

想想其他“消费者”将来会如何使用你的模型,并根据这些模型做出决定,我会说,“这取决于”,这些参数之间的联系有多紧密

如果可以将它们分成多个组,那么最好有多个功能。 e、 g.按时间范围、严重性、文本搜索等进行筛选

当它们明显属于一起时,创建一个类或结构来对它们进行分组并传递单个参数


想一想其他“消费者”将来会如何使用您的模型,并在此基础上做出您的决策//

据我所知,您的用例要求实现该模型。关于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();