Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# WPF-MVVM-谁负责新的数据提供程序连接?_C#_Wpf_Database_Mvvm_Responsibility - Fatal编程技术网

C# WPF-MVVM-谁负责新的数据提供程序连接?

C# WPF-MVVM-谁负责新的数据提供程序连接?,c#,wpf,database,mvvm,responsibility,C#,Wpf,Database,Mvvm,Responsibility,我知道这可能是一个“编码风格”的问题,但在这一点上我真的很困惑。目前,我正在尝试遵循MVVM模式(ViewModel、Repository、Controller等) 但是谁应该发起到数据源的连接呢?尤其是当多个控制器需要活动连接时 没有太多的可能性-或者每个控制器本身打开一个新连接,相应的ViewModel打开连接并将其传递给存储库,存储库再将其传递给控制器-或者连接被实例化得更早(例如StartUp.cs) 我知道没有“完美”的解决方案,但我希望得到一些灵感,也许是一个好的/最佳的实践 更新1

我知道这可能是一个“编码风格”的问题,但在这一点上我真的很困惑。目前,我正在尝试遵循MVVM模式(ViewModel、Repository、Controller等)

但是谁应该发起到数据源的连接呢?尤其是当多个控制器需要活动连接时

没有太多的可能性-或者每个控制器本身打开一个新连接,相应的ViewModel打开连接并将其传递给存储库,存储库再将其传递给控制器-或者连接被实例化得更早(例如StartUp.cs)

我知道没有“完美”的解决方案,但我希望得到一些灵感,也许是一个好的/最佳的实践

更新1

示例代码:

namespace Question {
class ViewModel {

    Person.Person p;
    Department.Department d;

    Person.PersonRepository pR;
    Department.DepartmentRepository dR;

    // Here in the VM both classes (Person and Department) intersect - should I inject an instance of a "IDataProvider" from here into the Repositorys?
    // If so, I'd have to pass it to the repository which has to pass it to it's controller.
 }
}

namespace Question.Person {
class Person {
    // Person Model
}

class PersonRepository {
    // This class does whatever a repository does and delegates database query to it's controller
}

class PersonController {

    // Or should the Controller itself instantiate a new "IDataProvider" ?

    // This class needs a connection to the databse to execute querys
 }
}

namespace Question.Department {

class Department {
    // Department Model
}

class DepartmentRepository {
    // This class does whatever a repository does and delegates database query to it's controller
}

class DepartmentController {
    // This class needs a connection to the databse to execute querys
 }
}

我认为您误解了MVVM模式。阅读本文:

它应该有助于更好地理解MVVM

更新:

存储库打开连接。如果您使用ORM访问数据库(EF、NHibernate),他们通常使用连接池。如果不使用ORM,则可以实现池


-本文描述了模式“存储库”。他实现了类似于采集的接口,并应隐藏数据访问功能。因此,应该在存储库中创建连接。

我认为您误解了MVVM模式。阅读本文:

它应该有助于更好地理解MVVM

更新:

存储库打开连接。如果您使用ORM访问数据库(EF、NHibernate),他们通常使用连接池。如果不使用ORM,则可以实现池


-本文描述了模式“存储库”。他实现了类似于采集的接口,并应隐藏数据访问功能。因此,应该在存储库中创建连接。

我认为您混淆了MVC和MVVM:

ViewModel负责使用从数据库获取数据的存储库从模型中检索信息,这里不需要控制器

 public ViewModel()
    {
       Person.PersonRepository pR;
       Department.DepartmentRepository dR;
     }
或者更好地集成到ViewModel中,以获得干净、解耦且可测试的实现:

public ViewModel(IPersonRepository personRepo, IDepartmentRepository depRepo)
    {
       Person.PersonRepository pR = personRepo;
       Department.DepartmentRepository dR = depRepo;
     }

我觉得你把MVC和MVVM搞混了:

ViewModel负责使用从数据库获取数据的存储库从模型中检索信息,这里不需要控制器

 public ViewModel()
    {
       Person.PersonRepository pR;
       Department.DepartmentRepository dR;
     }
或者更好地集成到ViewModel中,以获得干净、解耦且可测试的实现:

public ViewModel(IPersonRepository personRepo, IDepartmentRepository depRepo)
    {
       Person.PersonRepository pR = personRepo;
       Department.DepartmentRepository dR = depRepo;
     }

为什么要在类之间共享数据库连接?只要在需要的时候打开和关闭。当然,用一些接口抽象数据库逻辑,并将其注入到需要连接的地方。如果你认为我在谈论别的事情;那么请把密码寄出去。否则很难理解你的想法。我会分享代码-如果它存在的话。这更像是一个理论问题。当然,我会用一个接口来抽象数据库逻辑-'我会尝试编写一个和平的代码来向您展示我想知道的。为什么要在类之间共享数据库连接?只要在需要的时候打开和关闭。当然,用一些接口抽象数据库逻辑,并将其注入到需要连接的地方。如果你认为我在谈论别的事情;那么请把密码寄出去。否则很难理解你的想法。我会分享代码-如果它存在的话。这更像是一个理论问题。当然,我会用一个接口来抽象数据库逻辑-'我会尝试编写一个和平的代码来向您展示我想知道的内容。谢谢您的链接,它真的很有趣-但我不明白为什么我会误解MVVM-上面的代码-如前所述-只是一个演示我想知道的内容的示例假人。我知道MVVM中没有“规则”之类的东西。谢谢你的链接,这真的很有趣-但我不明白为什么我应该误解MVVM-上面的代码-如前所述-只是一个演示我想知道的东西的示例。我知道MVVM中没有“规则”之类的东西。非常好的答案,谢谢!因此,当我定义一个需要存储库接口的ViewModel时,我必须在相应视图的代码中声明/实例化我的ViewModel,不是吗?使用不带任何参数的构造函数,我可以在XAML中内联实例化ViewModel。尽量使view.XAML.cs文件保持为空,将viewmodels放在不同的类上,我建议您使用一些MVVM框架来帮助您处理样板文件,如MVVM Light。也有一个很好的例子来看看答案,谢谢!因此,当我定义一个需要存储库接口的ViewModel时,我必须在相应视图的代码中声明/实例化我的ViewModel,不是吗?使用不带任何参数的构造函数,我可以在XAML中内联实例化ViewModel。尽量使view.XAML.cs文件保持为空,将viewmodels放在不同的类上,我建议您使用一些MVVM框架来帮助您处理样板文件,如MVVM Light。还可以查看以下示例: