绑定到方法时Ninject不会触发方法?

时间:2015-03-15 16:33:32

标签: c# .net ninject

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列表总是空的?

1 个答案:

答案 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而不是实际的模型对象。

相关问题