Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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# 关于接口实现和可扩展性的体系结构问题_C#_Design Patterns_Architecture_Mvvm - Fatal编程技术网

C# 关于接口实现和可扩展性的体系结构问题

C# 关于接口实现和可扩展性的体系结构问题,c#,design-patterns,architecture,mvvm,C#,Design Patterns,Architecture,Mvvm,我创建了一个示例应用程序,只是为了测试和试用wpf的一些功能。我基本上是在wpf中尝试数据绑定,并且或多或少地快速完成了其余的工作。然后,我面临一个架构问题(是的,在开始编码之前应该提前考虑:),我想知道什么是最好的重构解决方案 我有一个简单的接口,根据定义的流程返回对象列表 public interface IDoStuff<out T> { IEnumerable<T> Do(string someParam); } 公共接口

我创建了一个示例应用程序,只是为了测试和试用wpf的一些功能。我基本上是在wpf中尝试数据绑定,并且或多或少地快速完成了其余的工作。然后,我面临一个架构问题(是的,在开始编码之前应该提前考虑:),我想知道什么是最好的重构解决方案

我有一个简单的接口,根据定义的流程返回对象列表

public interface IDoStuff<out T>
    {
        IEnumerable<T> Do(string someParam);
        }
公共接口
{
IEnumerable Do(字符串someParam);
}
我已经为这个接口创建了几个实现。然后我在wpf中有一个视图,它有一个带有硬编码值的下拉列表,根据您选择的内容,它将稳定接口的实现并填充一些列表

foreach (var item in new IDoSTuffImplementation1()<MyObj>.Do("imp 1"))
{
    MyObjs.Add(item);
}
foreach(新IDotuffImplementation1().Do(“imp 1”)中的变量项)
{
添加(项目);
}
MyObjs上的ater是listview的DataContext,并显示内容等等,但这不是主要问题

这些都是硬编码的,不是很好。如果要实现一个新接口,我需要将其添加到下拉列表中,并为该特定实现创建一个新的foreach(更多重复的代码)

好的,下面是我对改进/重构可扩展性的印象。 我在想一个好的方法是使用某种MVVM模式,将wpf视图转换为view+viewmodel。viewmodel将使用类似于spring的IoC,它(通过xml)实例化接口的一个特定实现,并将其注入viewmodel,然后调用其“Do”方法,所有人都会感到高兴。这样,当我们实现一个新组件时,唯一需要做的事情就是将它添加到xml配置文件中。 建议、意见?如果有的话,最好的方法是什么?
谢谢

我建议您将
方法
改为
属性
。并将该属性分配给
ComboBox
ItemsSource
属性,以简化使用数据绑定进行编码的过程。

实际上,如果提供另一个接口实现,我看不到任何架构更改。在使用MVVM时,您已经有了一个很好的体系结构,因此您试图完成的任务不会改变体系结构,而是会使用该体系结构扩展您的应用程序。

这确实没有多大帮助,我的主要问题是体系结构(以及建议的增强),不是如何进行数据绑定。您提到了MVVM,这就是为什么我建议您使用
属性
而不是
方法
。MVVM基于
通知
数据绑定
命令
。将
Unity
MEF
用作
IoC
。是的,但在当前情况下,构造函数将获得一个IWorker。在提议的场景中,我需要字典之类的东西,以便能够根据命令在适当的实现之间切换。但是在这里,我会有一些非常具体的代码来执行切换,无论是在按钮命令中,还是在switch语句中,或者是任何检查应该应用哪个实现的代码。我认为mvvm的想法是试图避免,除其他外,这?嗯。。。也许您可以跟踪VM中的IWorker对象,并使用CommandParameter来标识button的IWorker。如果保留所有IWorker实现的想法听起来不太好,您可以始终在代码隐藏中初始化VM,并创建一个接受IWorker对象数组的VM构造函数。