2016-11-01 5 views
0

Я получаю эту ошибку: [MissingMethodException: для этого объекта не существует конструктора без параметров. Тип объекта 'MyProject.TestViewModel.]Autofac asp.net MVC-контроллер и viewmodel

Global.asax.cs

var builder = new ContainerBuilder(); 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 
builder.RegisterType<MyProfileStore>().As<IMyProfileStore>(); 
builder.RegisterType<BreadCrumbImageService>().As<IBreadCrumbImageService>().SingleInstance(); 
builder.RegisterType<MyProfileViewModel>().As<IMyProfileViewModel>(); 
builder.RegisterType<BaseViewModel>().As<IBaseViewModel>(); 
builder.RegisterType<TestViewModel>().As<ITestViewModel>(); 
builder.RegisterType<TestSvc1>().As<ITestSvc>(); 
builder.RegisterType<TestSvc3>().As<ITestSvc>(); 
builder.RegisterType<TestSvc2>().As<ITestSvc>(); 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

Контроллер

public class MyAccountController : BaseController 
{ 
    public ActionResult Test(TestViewModel testViewModel) 
    { 
     _testViewModel = testViewModel; 
     return View(_testViewModel); 
    } 

ViewModel

public class TestViewModel : ITestViewModel 
{ 
    private TestSvc1 _testSvc1; 
    public string ViewModelText { get; set; } 

    public TestViewModel(TestSvc1 testSvc1) 
    { 
     _testSvc1 = testSvc1; 
     ViewModelText = _testSvc1.GetText(); 
    } 
} 

Существуют ли дополнительные шаги, мне нужно взять с собой это? Я ожидал, что как только я зарегистрировал строителя.RegisterType(). As(); Мне было бы хорошо идти. Я пытался сделать инъекцию на уровне контроллера в этом конструкторе, и это дает мне

None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'MyProject.MyAccountController' can be invoked with the available services and parameters: 
Cannot resolve parameter 'MyProject.TestViewModel testViewModel' of constructor 'Void .ctor(MyProject.TestViewModel)'. 

Я хотел бы придерживаться с воспламенением конструктора, я не знаю, что я здесь отсутствует.

+0

Этот вопрос был дан ответ здесь: http://stackoverflow.com/a/40362993/8116 –

ответ

0

У вас есть зависимость от TestSvc1, но сервис не зарегистрирован как этот тип. У вас есть TestSvc1, зарегистрированный как ITestSvc, и только так. Если вы хотите вместо этого ввести TestSvc1, вам нужно будет добавить AsSelf() к регистрации.

builder.RegisterType<TestSvc1>() 
    .As<ITestSvc>() 
    .AsSelf(); 

Или изменить ViewModel так принимает ITestSvc. Это, вероятно, предпочтительное решение.

+0

Спасибо, что ответили Эми! Я изменил его на AsSelf(), и он все еще запутан, но со вторым сообщением об ошибке. Я попытался вставить ITestSvc в свойство и в конструктор viewmodel, но это не дало никакой разницы. Любые другие мысли? Я чувствую, что мне не хватает чего-то фундаментального здесь, но это мой первый опыт создания Autofac в одном из моих проектов. Благодаря! Редактировать: Обратно к исходному сообщению об ошибке, что-то не перестраивалось должным образом или не попало в папку bin – plankalkul

+0

То же самое относится к регистрации 'TestViewModel'. Если вы хотите ввести 'Foo', его нужно зарегистрировать как' Foo'. Если он зарегистрирован как 'IFoo', вы не сможете его вводить как' Foo'. Autofac не знает, как его обеспечить. Пройдите через свои регистрационные записи один за другим и дважды проверьте, что ваши классы имеют зависимости от зарегистрированных услуг, а не от конкретных классов. – Amy

+0

Я хотел бы добавить, что я никогда не видел, чтобы вставляемые таким образом модели просмотра. Я не уверен, что то, что вы пытаетесь сделать, это возможная или плохая практика ... Не говоря о своем плохом, я просто понятия не имею. Обычно вы вводите услуги, а не модели. – Amy