2017-01-13 3 views
0

Моя маленькая, послушник, Bootstrapper настраивает контейнер следующим образом:Почему Unity не находит мой параметризованный конструктор?

protected override void ConfigureContainer() 
{ 
    base.ConfigureContainer(); 
    RegisterTypeIfMissing(typeof(IUserSettingsProvider), typeof(JsonUserSettingsProvider), true); 
    RegisterTypeIfMissing(typeof(IAppState), typeof(AppState), true); 
    Container.RegisterType<TripleDesEncryptionService>(new InjectionConstructor(App.CryptoKey)); 
    Container.RegisterType<BaseViewModel>(new InjectionConstructor(Container.Resolve<IAppState>())); 
} 

и мой BaseViewModel имеет только один CTOR:

public abstract class BaseViewModel : BindableBase, INotifyPropertyChanged 
{ 
    protected BaseViewModel(AppState appState) 
    { 
     AppState = appState; 
    } 
    ... 
} 

Когда я пытаюсь запустить проект, загрузчик терпит неудачу на RegisterType<BaseViewModel> и выдает следующее исключение.

System.InvalidOperationException: 'Тип ApptEase.Client.Infrastructure.ViewModels.BaseViewModel не конструктор, который принимает параметры (AppState).

AppState создан и зарегистрирован в контейнере в коде запуска приложения:

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 
    var boot = new Bootstrapper(); 
    boot.Run(); 
    Container = boot.Container; 
    _appState = new AppState(); 
    Container.RegisterInstance(typeof(AppState), _appState); 
} 
+1

Вы не можете решить абстрактный класс, так как экземпляр не может быть создан – 3615

+4

Плюс у него нет открытого конструктора ... –

+0

@ 3615 Я не хочу разрешать абстрактный класс, но я хочу, чтобы ctor-инъекция для всех его подклассов. – ProfK

ответ

0

Ваш класс BaseViewModel конструктор защищен. Что не видно Unity. Но в любом случае, так как пользователь 3615 написали в комментариях -

Вы не можете решить абстрактный класс, так как экземпляр не может быть создан

Так что я хотел бы предложить явно зарегистрировав экземпляр реализации конкретного и отображение его на этот базовый тип.

Container.RegisterInstance(typeof(BaseViewModel), new MyConcreteViewModel()); 

Но в конце концов, вы хотите, чтобы на самом деле была введена типизированная регистрация интерфейса. Это отталкивает тестируемость посредством насмешек.

+0

Я закончил решение «AppState» без Unity в защищенном конструкторе. Это тривиальная деталь и не будет в значительной степени проверяться. – ProfK

Смежные вопросы