ViewModel取决于MyObject的列表,该列表绑定到Repository方法,看起来它永远不会被调用?
CompositionRoot
public sealed class CompositionRoot {
public CompositionRoot(IKernel kernel) {
if (kernel == null) throw new ArgumentNullException("kernel");
this.kernel = kernel;
}
public void ComposeObjectGraph() {
BindRepositoriesByConvention();
BindDomainModel();
}
private void BindDomainModel() {
kernel
.Bind<IList<MyObject>>()
.ToMethod(ctx => ctx.Kernel.Get<IMyObjectsRepository>().FindAllMyObjects())
.WhenInjectedInto<MyObjectsManagementViewModel>();
}
private void BindRepositoriesByConvention() {
kernel.Bind(s => s
.FromThisAssembly()
.SelectAllClasses()
.EndingWith("Repository")
.BindSelection((type, baseType) => type
.GetInterfaces()
.Where(iface => iface.Name.EndsWith("Repository"))));
}
private readonly IKernel kernel;
}
MyObjectsManagementViewModel
public class MyObjectsManagementViewModel {
public MyObjectsViewModel(IList<MyObject> model) {
if (model == null) throw new ArgumentNullException("model");
Model = model;
}
public MyObject Current { get; set; }
public IList<MyObject> Model { get; set; }
}
MyObjectsRepository
public class MyObjectsRepository
: NHibernateRepository<MyObject>
, IMyObjectsRepository {
public MyObjectsRepository(ISession session) : base(session) { }
public IList<MyObject> FindAllMyObjects() { return GetAll(); }
}
NHibernateRepository
是一个抽象类,它公开受保护的成员,允许人们通过IMyObjectsRepository
之类的接口自定义方法名称,以表示更友好的域名,比如说。
对象映射工作正常,因为NHibernate已正确创建并更新了Domain-Driven Design的基础数据库。
在将MyObject列表绑定到存储库方法时,问题肯定是我对Ninject的理解或误用(我相信)。
我给 FindAllMyObjects 方法设置了一个断点,它永远不会被击中?
并且注入MyObjectsManagementViewModel构造函数的MyObjects列表总是空的?
答案 0 :(得分:2)
我认为这里的问题是你绑定到Ninject不期望解决的类型(IList<T>
)。最简单的解决方案是绑定到一个Func,它将返回你想要的对象。
例如:
kernel
.Bind<Func<IList<MyObject>>>()
.ToMethod(ctx => () => ctx.Kernel.Get<IMyObjectsRepository>().FindAllMyObjects())
.WhenInjectedInto<MyObjectsManagementViewModel>();
然后:
public MyObjectsViewModel(Func<IList<MyObject>> model) {
if (model == null) throw new ArgumentNullException("model");
Model = model();
}
这有效地在构造MyObjectsViewModel对象时从存储库中延迟加载项目。
另一种替代方案(可能更清晰,更好的设计)是创建一个新的界面,如IMyObjectProvider
,它只负责查找和返回正确的数据。然后该接口将被注入到您的viewmodel而不是实际的模型对象。