IoC的存储库模式

时间:2017-09-16 11:48:15

标签: c# wpf entity-framework sqlite inversion-of-control

我正在构建一个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不允许我注册它)。

我非常感谢这方面的任何帮助或建议。

0 个答案:

没有答案