2014-03-28 44 views
0

我想配置我的绑定。Ninject:如何绑定ToMethod

 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 for the Help。 Dennis

回答

1

我想你应该使用ConstructorArgument而不是Parameter。参数名称必须与构造函数的名称相匹配。

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

如果是这样,还有其他方法可以实现这一点。你应该看看范围。它们用于使对象树的某个部分使用相同的实例。

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