在我的应用程序中,模型是表示数据库的数据集,因此在应用程序执行的任何时候,应该只有一个模型对象。目前,这是在应用程序启动时创建的,并作为属性存储在应用程序类中。视图模型通过其构造函数接收对数据集/模型的引用。
看到只能有一个数据集,最好是实现一个单独的类来创建/返回数据集并让viewmodels从中获取它们的引用(这种方法有问题吗?)
谢谢, 詹姆斯
答案 0 :(得分:4)
在构造函数上使用它会使它更灵活。实际上,您可以实现 Singleton 并始终传递相同的单例实例,或者如果您使用的话,可以使用 DI框架将其保留为单例。
这将阻止您的ViewModel了解模型的生命周期,从而使单元测试更容易。
数据集有一件事 - 它们不是真正的模型,因为它们是松散的。即使您必须使用数据集,我也会创建实体类模型并对其进行翻译。数据集不是DDD。
答案 1 :(得分:4)
根据我个人的经验,这是一种坚如磐石的方法:
但是,OOP-Zealots会争辩说你不应该使用经典的Gang of Four Singleton(使用静态Instance属性),而是使用DI Singleton,一个由DI Container创建的对象,然后传递到任何地方。
就个人而言,我认为这是一个权衡:GoF Singleton易于使用且简单。我从来没有遇到过必须更换它或数据库访问的情况。我有一个用于数据库访问的接口,如果需要,我可以在Singleton中更改实现(并增强它,以便即使在运行时也可以)。它还可以为您节省大量样板代码,但请记住,您的模型与数据库紧密耦合,没有它就不能存在。
我可以看到DI内容的唯一优势是您可以从外部配置进行配置,因为我怀疑数据库访问的生命周期管理是否会发生变化,这将是DI的另一个优势。从长远来看,你的ObjectModel可能会保持清洁(加上大项目)。
我个人喜欢使用这种通用单例实现。一些对象的玩家会再次争论它更像是一个包装而不是单身,但它确实做得很好,甚至可以让你保持你的ObjectModels(“与ViewModels相反,不要错误”),因为你不需要用静态成员实现它们作为单例:
public class Singleton<T> where T : class {
static object SyncRoot = new object( );
static T instance;
public static T Instance {
get {
if ( instance == null ) {
lock ( SyncRoot ) {
if ( instance == null ) {
ConstructorInfo ci = typeof( T ).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null );
if ( ci == null ) { throw new InvalidOperationException( "class must contain a private constructor" ); }
instance = (T)ci.Invoke( null );
}
}
}
return instance;
}
}
}
http://www.sanity-free.com/132/generic_singleton_pattern_in_csharp.html