WPF Prism Unity - RegisterType с InjectionConstructor - PullRequest
0 голосов
/ 02 октября 2019

У меня есть простое приложение .Net Core WPF / PRISM / Unity, которое имеет такой класс:

public class MyClass : IMyClass
{
    public MyClass(string someMessage)
    {

    }
}

public interface IMyClass
{
}

В App.Xaml.cs у меня есть следующее:

    public partial class App : PrismApplication
{
    protected override Window CreateShell()
    {
        Container.GetContainer().AddExtension(new Diagnostic());
        return Container.Resolve<MainWindow>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterSingleton<MainWindow>();

        containerRegistry.GetContainer().RegisterType(
            typeof(IMyClass), 
            typeof(MyClass), 
            "", 
            new TransientLifetimeManager(), 
            new InjectionConstructor("Some nice message"));
    }
}

Но если я пытаюсь внедрить IMyClass ...

    public partial class MainWindow : Window
{
    private readonly IMyClass myClass;

    public MainWindow(IMyClass myClass)
    {
        InitializeComponent();
        this.myClass = myClass;
    }

, я получаю следующую ошибку:

Unity.ResolutionFailedException: 'Текущий тип, WpfApp7.IMyClass, является интерфейсоми не может быть построено. Вам не хватает соответствия типов?


Исключительная ситуация при:

· разрешающем типе: 'IMyClass' для параметра: 'myClass' в конструкторе: MainWindow (IMyClass myClass) · разрешающем типе: 'MainWindow'

Я сделал консольное приложение - без Prism - и сделал тот же код, он просто отлично работал.

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Я решил это ..., используя вместо этого этот общий метод.

containerRegistry.GetContainer().RegisterType<IMyClass, MyClass>(new InjectionConstructor(new object[] { "Works Nicely" }));

Спасибо за ваше время и усилия.

0 голосов
/ 02 октября 2019

Вы должны создать MainWindow в вашем CreateShell() методе. Это работает:

public partial class App : PrismApplication
{
    protected override Window CreateShell()
    {
        return Container.Resolve<MainWindow>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.GetContainer().RegisterType(
        typeof(IMyClass),
        typeof(MyClass),
        "",
        new TransientLifetimeManager(),
        new InjectionConstructor("Some nice message"));
    }
}

public class MyClass : IMyClass
{
    public MyClass(string s)
    {
        //...
    }
}
...