C# Ninject在绑定到方法时不触发方法?
依赖于MyObject的列表,该列表绑定到一个看起来从未被调用的方法 合成根目录C# Ninject在绑定到方法时不触发方法?,c#,.net,ninject,C#,.net,Ninject,依赖于MyObject的列表,该列表绑定到一个看起来从未被调用的方法 合成根目录 public sealed class CompositionRoot { public CompositionRoot(IKernel kernel) { if (kernel == null) throw new ArgumentNullException("kernel"); this.kernel = kernel; } public void Co
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;
}
公共密封类组合根{
公共合成根(IKernel内核){
如果(kernel==null)抛出新的ArgumentNullException(“kernel”);
this.kernel=内核;
}
public void ComposeObjectGraph(){
BindRepositoriesByConvention();
BindDomainModel();
}
私有void BindDomainModel(){
内核
.Bind()
.ToMethod(ctx=>ctx.Kernel.Get().FindAllMyObjects())
.当输入到()时;
}
私有无效BindRepositoriesByConvention(){
kernel.Bind(s=>s
.FromThisAssembly()中的
.SelectAllClasses()
.EndingWith(“存储库”)
.BindSelection((类型,基本类型)=>类型
.GetInterfaces()
.Where(iface=>iface.Name.EndsWith(“存储库”);
}
私有只读IKernel内核;
}
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; }
}
公共类MyObjectsManagementViewModel{
公共MyObjectsViewModel(IList模型){
如果(model==null)抛出新ArgumentNullException(“model”);
模型=模型;
}
公共MyObject当前{get;set;}
公共IList模型{get;set;}
}
MyObjectsRepository
public class MyObjectsRepository
: NHibernateRepository<MyObject>
, IMyObjectsRepository {
public MyObjectsRepository(ISession session) : base(session) { }
public IList<MyObject> FindAllMyObjects() { return GetAll(); }
}
公共类MyObjectsRepository
:nhibernaterepositional
,IMyObjectsRepository{
公共MyObjectsRepository(会话会话):基(会话){}
公共IList findallMyObject(){return GetAll();}
}
nhibernaterepositionory
是一个抽象类,它公开了受保护的成员,允许用户通过接口(例如imyobjectsrpositionory
)自定义方法名,以声明一个更友好的域名
对象映射工作正常,正如正确创建和更新基础数据库一样
问题肯定是我在将MyObject列表绑定到存储库方法时理解或误用了(我相信)
- 我给FindAllMyObjects方法设置了一个断点,但它从未被命中
- 而注入MyObjectsManagementViewModel构造函数的MyObject列表始终为空
IList
)。最简单的解决方案是绑定到将返回所需对象的Func
例如:
kernel
.Bind<Func<IList<MyObject>>>()
.ToMethod(ctx => () => ctx.Kernel.Get<IMyObjectsRepository>().FindAllMyObjects())
.WhenInjectedInto<MyObjectsManagementViewModel>();
内核
.Bind()
.ToMethod(ctx=>()=>ctx.Kernel.Get().FindAllMyObjects())
.当输入到()时;
然后:
public MyObjectsViewModel(Func模型){
如果(model==null)抛出新ArgumentNullException(“model”);
模型=模型();
}
当构造MyObjectsViewModel对象时,这有效地从存储库中延迟加载项
另一种选择(可能更清晰、更好的设计)是创建一个新的接口,如
IMyObjectProvider
,它只负责查找和返回正确的数据。然后,该接口将被注入到您的viewmodel中,而不是实际的模型对象。我认为这里的问题是您正在绑定到Ninject不希望解决的类型(IList
)。最简单的解决方案是绑定到将返回所需对象的Func
例如:
kernel
.Bind<Func<IList<MyObject>>>()
.ToMethod(ctx => () => ctx.Kernel.Get<IMyObjectsRepository>().FindAllMyObjects())
.WhenInjectedInto<MyObjectsManagementViewModel>();
内核
.Bind()
.ToMethod(ctx=>()=>ctx.Kernel.Get().FindAllMyObjects())
.当输入到()时;
然后:
public MyObjectsViewModel(Func模型){
如果(model==null)抛出新ArgumentNullException(“model”);
模型=模型();
}
当构造MyObjectsViewModel对象时,这有效地从存储库中延迟加载项
另一种选择(可能更清晰、更好的设计)是创建一个新的接口,如
IMyObjectProvider
,它只负责查找和返回正确的数据。然后,该接口将被注入到您的viewmodel中,而不是实际的模型对象。我认为这里的问题是您正在绑定到Ninject不希望解决的类型(IList
)。最简单的解决方案是绑定到将返回所需对象的Func
例如:
kernel
.Bind<Func<IList<MyObject>>>()
.ToMethod(ctx => () => ctx.Kernel.Get<IMyObjectsRepository>().FindAllMyObjects())
.WhenInjectedInto<MyObjectsManagementViewModel>();
内核
.Bind()
.ToMethod(ctx=>()=>ctx.Kernel.Get().FindAllMyObjects())
.当输入到()时;
然后:
public MyObjectsViewModel(Func模型){
如果(model==null)抛出新ArgumentNullException(“model”);
模型=模型();
}
当构造MyObjectsViewModel对象时,这有效地从存储库中延迟加载项
另一种选择(可能更清晰、更好的设计)是创建一个新的接口,如
IMyObjectProvider
,它只负责查找和返回正确的数据。然后,该接口将被注入到您的viewmodel中,而不是实际的模型对象。我认为这里的问题是您正在绑定到Ninject不希望解决的类型(IList
)。最简单的解决方案是绑定到将返回所需对象的Func
例如:
kernel
.Bind<Func<IList<MyObject>>>()
.ToMethod(ctx => () => ctx.Kernel.Get<IMyObjectsRepository>().FindAllMyObjects())
.WhenInjectedInto<MyObjectsManagementViewModel>();
内核
.Bind()
.ToMethod(ctx=>()=>ctx.Kernel.Get().FindAllMyObjects())
.当输入到()时;
然后:
public MyObjectsViewModel(Func模型){
如果(model==null)抛出新ArgumentNullException(“model”);
模型=模型();
}
当构造MyObjectsViewModel对象时,这有效地从存储库中延迟加载项
另一种选择(可能更清晰、更好的设计)是cr