2011-03-10 95 views
0

我对存储库模式很陌生,但到目前为止,我喜欢我如何使用它。我在Codeplex上发现了这个implementation。我现在的问题是:如何使用数据存储库

我是否正确使用存储库模式?

谁能提供下我的例子更好的解决方案?

这里是一个例子(我使用poco),在那里我已经在过程中提前关闭了一个关闭的位置。一些UI交互后,我要更新的位置属性(如姓名)和相关的用户(包括添加和删除):


using (var repo = RepositoryHelper.GetLocationRepository()) 
using (var repo2 = RepositoryHelper.GetUserRepository(repo.UnitOfWork)) 
{ 
    repo.Add(location); 
    repo.UnitOfWork.Context.ObjectStateManager.ChangeObjectState(location, EntityState.Modified); 

    foreach (var user in location.Users) 
    { 
     repo2.Add(user); 
     if (user.Id != 0) 
     { 
      repo2.UnitOfWork.Context.ObjectStateManager.ChangeObjectState(user, EntityState.Unchanged); 
     } 
    } 

    foreach (var user in _remove.Where(user => user.Id != 0)) 
    { 
     repo2.Delete(user); 
    } 

    repo2.UnitOfWork.Commit(); 
} 

的例子是工作,虽然我如何到了很迷茫附加命令。如果对象来自另一个环境,我认为它会被使用?!但是,如果我尝试,我总是会得到一个异常,该对象正在被另一个上下文使用。并且可以说,我正在分离位置,之后我无法访问Users集合。

另一个问题(我认为它与此密切相关):我一直在读,数据库连接应尽可能短。因此,我将IDisposable接口添加到存储库,所以我可以像ObjectContext一样使用它们。然而,我发现了一些例子(我认为也在wpf应用程序框架中),这不是通常的方法。那么,我应该遵循什么样的话?

亲切的问候,

亚光

回答

1

关键的问题:你想用的工作(UOW)模式库和单位为什么呢?

人们通常使用这些模式将EF代码分离到内部存储库和UoW实现。因为上层将完全独立于EF。

你的实现不提供这种分离。这只是一个奇怪的包装ObjectContextObjectSet。在这种情况下,您根本不需要存储库和UoW,您可以直接使用EF类。即使使用EF类,您仍然可以使您的代码可测试(人们有时引入存储库和UoW的另一个错误原因)。

回答第二个问题。 ObjectContext的生存时间应尽可能短,但这并不意味着您应为每个查询创建新的上下文。 ObjectContext内部处理连接,仅在需要时才打开它。为什么ObjectContext应该在短时间内使用的原因是它也实现了UoW模式,另外还有IdentityMap模式(我描述的含义here)。在WPF应用程序ObjectContext通常只要窗口或控件呈现数据进行修改。

+0

我需要一点时间来思考第一部分。但关于第二个:这意味着,可以在视图模型的构造函数中创建一个上下文(并且在处理视图模型时进行处理)是可以的? – Matthias 2011-03-10 13:38:14

+0

我们在谈论WPF吗?如果是这样,我不能回答它,因为我不是WPF开发人员,我从来没有使用过WPF或MVVM。但是,如果将常见的WinForms与MVP(模型 - 视图 - 演示者)模式结合使用,最佳做法是为每个演示者提供单个上下文。 – 2011-03-10 13:40:22

+0

第一部分:对不起,但我有点困惑。我想强调,这是我第一次使用存储库模式,所以上面的代码只是我的一个起点。我认为你的意思是说我正在使用国家经理?除了我发现的所有样本都以某种方式使用存储库。 – Matthias 2011-03-10 13:43:54