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

时间:2018-10-11 18:32:12

标签: c# wpf repository mvvm-light

我正在尝试实现用于项目中学习目的的存储库模式。我正在使用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容器的新手,所以不确定在这里我到底在做什么错。

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

谢谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

您不仅在实例化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>();
}