我对存储库模式很陌生,但到目前为止,我喜欢我如何使用它。我在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应用程序框架中),这不是通常的方法。那么,我应该遵循什么样的话?
亲切的问候,
亚光
我需要一点时间来思考第一部分。但关于第二个:这意味着,可以在视图模型的构造函数中创建一个上下文(并且在处理视图模型时进行处理)是可以的? – Matthias 2011-03-10 13:38:14
我们在谈论WPF吗?如果是这样,我不能回答它,因为我不是WPF开发人员,我从来没有使用过WPF或MVVM。但是,如果将常见的WinForms与MVP(模型 - 视图 - 演示者)模式结合使用,最佳做法是为每个演示者提供单个上下文。 – 2011-03-10 13:40:22
第一部分:对不起,但我有点困惑。我想强调,这是我第一次使用存储库模式,所以上面的代码只是我的一个起点。我认为你的意思是说我正在使用国家经理?除了我发现的所有样本都以某种方式使用存储库。 – Matthias 2011-03-10 13:43:54