我正在尝试实现用于项目中学习目的的存储库模式。我正在使用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容器的新手,所以不确定在这里我到底在做什么错。
如果有人可以给我一个很好的解释,说明我需要更改的内容等,那就太好了。我知道很多人认为工作单元/存储库模式是一种反模式,但我对此并不担心,这纯粹是出于学习目的。
谢谢您的任何建议!
答案 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>();
}