Catel с Ninject

Наша компания использует Ninject для DI. Мне нужно создать приложение WPF с MVVM и использовать 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 или есть лучшие решения?


person Stefan Schmid    schedule 06.11.2014    source источник


Ответы (1)


Ознакомьтесь с рекомендуемым подходом к замене компонентов IoC по умолчанию:

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

Чтобы создать свой собственный компонент, позвольте ядру Ninject реализовать правильный интерфейс (например, IDependencyResolver или IServiceLocator), и все должно быть установлено.

person Geert van Horrik    schedule 06.11.2014
comment
Вы имеете в виду этот подход (NinjectDependencyResolver)? stackoverflow.com/questions/22221314 / Если нет, то как я могу позволить ядру Ninject реализовать интерфейсы? - person Stefan Schmid; 06.11.2014
comment
Нет, в грядущей версии 4.0 улучшена поддержка внешних контейнеров. Вы можете зарегистрировать контейнер (например, Ninject ServiceLocator), и все службы должны быть автоматически зарегистрированы для вас. - person Geert van Horrik; 06.11.2014