工作单元/存储库模式,在缓存中找不到类型
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>();
}
我正在尝试在一个项目中实现一个用于学习目的的存储库模式。我正在使用 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>();
}