Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ninject在绑定到方法时不触发方法?_C#_.net_Ninject - Fatal编程技术网

C# Ninject在绑定到方法时不触发方法?

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

依赖于MyObject的列表,该列表绑定到一个看起来从未被调用的方法

合成根目录

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列表始终为空


我认为这里的问题是您正在绑定到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对象时,这有效地从存储库中延迟加载项


另一种选择(可能更清晰、更好的设计)是创建一个新的接口,如
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