[英]Managing DbContext in WPF Application
我目前正在使用.NET 4.6开发WPF应用程序。 我们正在使用实体框架与SQL Server进行持久性和数据库交互。 当我加入该项目时,所有数据库交互都在下面的代码中完成,如下所示。 (是的,我知道这是不好的做法)
IList<User> users;
using (AppDbContext db = new AppDbContext())
{
users = db.Users.Where(x => x.Active == true).ToList();
}
// do code to update UI
我基本上说这是一种不好的做法,我们需要从表示层中分离出业务逻辑和查询。 我以为存储库模式可能是一个不错的起点,但是我对如何管理DbContext表示怀疑。
仓库接口示例
public interface IUserService : IDisposable
{
IList<applicationuser> GetUsers();
IList<AllApplicationUser> GetActiveUsers();
AllApplicationUser GetUserView(long id);
applicationuser GetUser(long id);
void CreateUser(applicationuser user);
void UpdateUser(applicationuser user);
void DeleteUser(long id);
void Save();
applicationuser Authenticate(string username, string password);
}
并执行
class UserService : IUserService
{
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly OMEGAEntities _db;
private bool _disposed = false;
public UserService()
{
_db = new OMEGAEntities();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_db.Dispose();
}
}
_disposed = true;
}
public IList<applicationuser> GetUsers()
{
// fetch only active users that do not have the role SuperAdmin
return _db.applicationusers.Where(u => u.roleid != 1 && u.activeflag == true).ToList();
}
public IList<AllApplicationUser> GetActiveUsers()
{
return _db.AllApplicationUsers.Where(u => u.activeflag == true && u.roleid != 1).ToList();
}
public AllApplicationUser GetUserView(long id)
{
return _db.AllApplicationUsers.Single(x => x.id == id);
}
public applicationuser GetUser(long id)
{
return _db.applicationusers.Find(id);
}
public void CreateUser(applicationuser user)
{
_db.applicationusers.Add(user);
}
public void UpdateUser(applicationuser user)
{
_db.Entry(user).State = EntityState.Modified;
}
public void DeleteUser(long id)
{
var user = _db.applicationusers.Find(id);
_db.applicationusers.Remove(user);
}
public void Save()
{
_db.SaveChanges();
}
public applicationuser Authenticate(string username, string password)
{
applicationuser user =
_db.applicationusers.SingleOrDefault(u => u.loginid.ToLower().Equals(username.ToLower()));
if (user != null)
{
if (Common.Utils.DecryptData(user.password).Equals(password))
{
return user;
}
}
return null;
}
}
现在的问题是,当有多个窗口打开时,有多个打开的上下文和长时间运行的上下文。 目前浮现的想法之一是对整个应用程序使用单个上下文,因为它是单个用户桌面应用程序,但是这似乎不是最好的想法。 另外,在关闭窗口等情况下,还需要处理dbContext。
我已经了解了在ASP.NET中每个请求使用DbContext的想法。 也许每个窗口可以使用一个?
我只是想知道存储库模式是否是WPF应用程序的最佳方法? 我已经看到许多人在ASP.NET中成功使用它。
您可以在存储库顶部创建某种工作单元,然后构造器将dbcontext注入存储库中
public class UnitOfWork : IUnitOfWork
{
private IUserService userService;
private omegaentities dbcontext;
public UnitOfWork ()
{
dbcontext = new Omegaentities ();
}
public IUserService UserService {
get {
If (userService == null)
{ userService = new UserService(dbcontext);}
Return userService;
}
}
那你就打电话
unitOfWork.UserService.GetUsers();
...这提供了更多的抽象层,您仍然需要处理unitofwork的单个实例,但是可以使用一些DI魔术很好地处理它:)
注意:我是从android应用程序编写的! (在手机上编码c#不会晃动!)
这实际上取决于您如何使用DbContext。 如果您正在读取某些数据,而其他应用程序可能会更改这些数据,则建议每次都使用一次性DbContext。 如果您确定您的应用程序是唯一接触数据库的应用程序,则在存储库中保留一个DbContext并在整个应用程序中使用一个单例存储库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.