工作单元/存储库模式,在缓存中找不到类型

Unit Of Work / Repository Pattern, Type Not Found In Cache

我正在尝试在一个项目中实现一个用于学习目的的存储库模式。我正在使用 MVVM Light 注册接口并尝试注入视图模型。

为了便于阅读,我删除了所有其他存储库,只包含 RuleRepository。

查看模型定位器

尝试注册 IUnitOfWork 时代码中断并给出错误 - 在缓存中找不到类型:YAI.BomConfigurator.Core.Context.BomConfiguratorContext.

注意:不确定是否需要在此处注册 IRepository 接口?

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {
            SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
            SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
        }
        else
        {
            SimpleIoc.Default.Register<IDataService, DataService>();
            SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
        }
        SimpleIoc.Default.Register<LoginViewModel>();
    }

    public LoginViewModel LoginViewModel
    {
        get
        {
            return ServiceLocator.Current.GetInstance<LoginViewModel>();
        }
    }
}

LoginViewModel

这里是我尝试将 IUnitOfWork 注入视图模型的地方。

public class LoginViewModel : ViewModelBase
{
    private readonly IUnitOfWork _UnitOfWork;
    public LoginViewModel(IUnitOfWork unitOfWork)
    {
        _UnitOfWork = unitOfWork;
    }
}

IUnitOfWork

public interface IUnitOfWork : IDisposable
{
    IRuleRepository Rules { get; }
    int Complete();
}

UnitOfWork

public class UnitOfWork : IUnitOfWork
{
    private readonly BomConfiguratorContext _context;
    public IRuleRepository Rules { get; private set; }

    public UnitOfWork(BomConfiguratorContext context)
    {
        _context = context;
    }

    public int Complete()
    {
        return _context.SaveChanges();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

RuleRepository

public class RuleRepository : Repository<Rule>,IRuleRepository
{
    public RuleRepository(BomConfiguratorContext context)
       : base(context)
    {

    }
}

我从 Mosh Hamedani youtube video 复制了很多内容,并尝试添加我们注入视图模型构造函数的位。我是依赖注入和 IOC 容器的新手,所以不确定我到底做错了什么。

如果有人能给我一个很好的解释,说明我需要更改什么等等,那就太好了。我知道很多人认为工作单元/存储库模式是一种反模式,但我并不担心,这纯粹是为了学习目的。

感谢您的任何建议!

在实例化 UnitOfWork 时,您不仅将 UnitOfWork 的实例注入 LoginViewModel,还将 BomConfiguratorContext 的实例注入 UnitOfWork:

public class UnitOfWork : IUnitOfWork
{
    private readonly BomConfiguratorContext _context;
    public IRuleRepository Rules { get; private set; }

    // here you inject a BomConfiguratorContext, but none is registered in the VM Locator
    public UnitOfWork(BomConfiguratorContext context)
    {
        _context = context;
    }

    ...
}

因此您需要更改 ViewModelLocator 以同时注册 BomConfiguratorContext:

static ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    if (ViewModelBase.IsInDesignModeStatic)
    {
        SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
        SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
    }
    else
    {
        SimpleIoc.Default.Register<IDataService, DataService>();
        SimpleIoc.Default.Register<IUnitOfWork, UnitOfWork>();
    }
    SimpleIoc.Default.Register<LoginViewModel>();

    // Missing something like this (not sure what interface it implements...)
    SimpleIoc.Default.Register<IConfiguratorContext, BomConfiguratorContext>();
}