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