2014-11-06 56 views
0

我们公司正在使用Ninject for DI。我必须用MVVM创建一个WPF应用程序,并且想要使用Catel。 因为我们的服务具有DB DataContext注入Ninject,我不知道从哪里开始。Catel与Ninject

我已经开始了一个准备好的骨架项目。 这是App.xaml.cs包含:

public partial class App : Application 
{ 
    public IKernel Container; 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 
     ConfigureContainer(); 
     ComposeObjects(); 
     Current.MainWindow.Show(); 
    } 

    private void ConfigureContainer() 
    { 
     var modules = new INinjectModule[] 
      { 
       new ServiceModule() 
      }; 

     Container = new StandardKernel(modules); 
    } 

    private void ComposeObjects() 
    { 
     Current.MainWindow = Container.Get<MainWindow>(); 
     Current.MainWindow.Title = "DI with Ninject"; 
    } 
} 

ServiceModuleNinjectModule继承。

与该代码我可以使用此构造我MainWindow

public MainWindow(IAuthenticationService authenticationService) 
{ 
    InitializeComponent(); 
    ViewModel = new MainWindowViewModel(authenticationService); 
    DataContext = ViewModel; 
} 

IAuthenticationService经App.xaml.cs和Ninject注入。在我看来,这个解决方案很难维护,因为如果我需要一个新服务,我必须将其添加到我的MainWindow的构造函数中。 现在我需要与Catel一样的工作,但是我没有在文档中找到任何东西。

编辑: 我在文档中发现我可以注册一个外部IoC容器。 如何创建我自己的组件(文档:替换默认组件),它与Ninject的标准内核一起使用?

此外,这是DI的一个好方法还是有更好的解决方案?

回答

1

请参阅如何替换默认的IoC部件推荐的方法:

https://catelproject.atlassian.net/wiki/display/CTL/Replacing+the+default+components

要创建自己的组件,让Ninject内核实施正确的接口(例如,的IDependencyResolver或IServiceLocator)和都应该设置。

+0

你的意思是这种方法(NinjectDependencyResolver)? http://stackoverflow.com/questions/22221314/catel-ninject-ninject-activationexception-when-resolving-iuivisualizerservice 如果不是,我该如何让Ninject内核实现接口? – 2014-11-06 11:07:57

+0

不,即将到来的4.0已经改进了对外部容器的支持。您可以注册容器(比如Ninject ServiceLocator),并且所有服务都应该自动为您注册。 – 2014-11-06 13:31:26