【问题标题】:Catel with NinjectCatel 与 Ninject
【发布时间】:2014-11-06 09:04:19
【问题描述】:

我们公司正在使用 Ninject 进行 DI。我必须使用 MVVM 创建一个 WPF 应用程序并想使用 Catel。 因为我们有 DB DataContext 的服务是用 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";
    }
}

ServiceModule 继承自 NinjectModule

通过该代码,我可以使用我的MainWindow 的构造函数:

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

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

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

这也是DI的好方法还是有更好的解决方案?

【问题讨论】:

    标签: c# mvvm ninject inversion-of-control catel


    【解决方案1】:

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

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

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

    【讨论】:

    • 你的意思是这种方法(NinjectDependencyResolver)吗? stackoverflow.com/questions/22221314/…如果没有,如何让Ninject内核实现接口?
    • 不,即将到来的 4.0 改进了对外部容器的支持。您可以注册容器(比如 Ninject ServiceLocator),所有服务都会自动为您注册。
    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多