Ninject:如何绑定ToMethod

时间:2014-03-28 10:25:40

标签: c# ninject

我想配置我的绑定。

        Bind<DbContext>().To<HangTagVerwaltungContext>();
        Bind<IUnitOfWork>()
            .ToConstructor(
                x => new UnitOfWork(true, true, x.Inject<DbContext>()));

        // Managers
        Bind<ITagManager>().To<TagManager>();

        // ViewModels
        Bind<TagEditViewModel>().ToMethod(
            context =>
            {
                IUnitOfWork unitOfWork = context.Kernel.Get<IUnitOfWork>();
                ITagManager tagManager =
                    context.Kernel.Get<ITagManager>(
                        new Parameter(@"unitOfWork", unitOfWork, false));

                return new TagEditViewModel(tagManager, 
                    context.Kernel.Get<INavigationService>(), unitOfWork);
            });

我的问题是,每次他为TagManager创建一个新的UnitOfWork而不使用参数我在ToMethod方法中给他。我错了什么?

帮助的Thx。 丹尼斯

1 个答案:

答案 0 :(得分:1)

我认为你应该使用ConstructorArgument代替Parameter。参数名称必须与构造函数名称匹配。

但是,你为什么这么复杂? (DI是为了让你更容易,而不是更复杂。)是因为你需要为tagManager和TagEditViewModel使用相同的IUnitOfWork实例吗?

如果是这种情况,还有其他方法可以实现这一目标。你应该研究范围。它们用于使对象树的某些部分使用相同的实例。

对于您展示的场景,您可能想尝试.InCallScope(),但通常对于IUnitOfWork,还有其他一些在整个应用程序中工作得更好的东西,例如.InRequestScope()用于Web项目或其他一些自定义范围。还有其他的stackoverflow问题已经涵盖了这个问题。