我正在构建一个WPF应用程序(存储系统),它将运行很长时间,因此我对使用Entity Framework和Repository Patterns时应该选择哪个选项感兴趣。
我所做的是,我将数据访问层(DAL)分离为主项目引用的单独类库。对于这些技术,我决定使用Entity Framework 6& SQLite数据库(加上EF的SQLite插件)。
在主项目中,除了其他东西(例如Prism)之外,我在使用ViewModel时也使用Unity for IoC。
这就是我在 Bootstrapper.cs 类下注册我的存储库的方式:
Container.RegisterType<IUserRepository, UserRepository>(new TransientLifetimeManager());
我决定使用TransientLifetimeManager
的原因是为了确保每次创建ViewModel时都会重新创建此类,从而确保从数据库中提取新数据。
这是一个(过度简化的)存储库,只有两种方法:
public interface IUserRepository
{
UserLevel TryLoginUser(User user);
string RegisterNewUser(User user);
void Dispose();
}
使用示例实现:
public class UserRepository : IUserRepository
{
public enum UserLevel { Regular, Supervisor, Admin, Invalid };
private readonly DataContext _context;
public UserRepository()
{
_context = new DataContext();
}
public UserLevel TryLoginUser(User user)
{
return UserLevel.Invalid;
}
public string RegisterNewUser(User user)
{
return null;
}
}
用户将要做的是,他们将在应用程序的整个生命周期内在2个(或3个)主窗口之间切换。为了确保来自Entity Framework的数据库数据与数据库同步,我决定在方法本身的构造函数中初始化新的DataContext
(重新加载数据)。 / p>
当我在我的窗口之间来回浏览(并调用各种存储库)时,我已经探索了内存使用情况,我注意到内存使用率开始上升,这意味着,显然,我的方法有问题初始化和注入Repositories
。
最后,关于这个主题,我还尝试以某种方式注册我的DataContext.cs
(这很简单,只是继承自 DbContext ),以便它可以注入到库;但是我甚至在注册时遇到了问题(因为它缺少接口定义,Unity不允许我注册它)。
我非常感谢这方面的任何帮助或建议。