2016-11-01 7 views
0

私はこのエラーを受け取ります: [MissingMethodException:このオブジェクトに対して定義されたパラメータのないコンストラクタ。オブジェクトタイプ 'MyProject.TestViewModel'。]Autofac MVCコントローラとビューモデル

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(); 
    } 
} 

は私が取る必要がある追加の手順がありますこの?私はbuilder.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に依存していますが、そのタイプとして登録されているサービスはありません。 TestSvc1ITestSvcとして登録されています。代わりにTestSvc1を注入する場合は、登録にAsSelf()を追加する必要があります。

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

それともそれはITestSvcを受け入れるように、あなたのviewmodelを変更。これはおそらく望ましい解決策です。

+0

エイミーに返信ありがとうございます!私はそれをAsSelf()に変更しました。それはまだ気難しいですが、2番目のエラーメッセージがあります。私はITestSvcをプロパティとビューモデルのコンストラクタに入れてみましたが、違いはありませんでした。他の考え?私はここで何か根本的なものを見逃しているように感じますが、これは私のプロジェクトの1つでオートファックを設定した初めてのことです。ありがとう! 編集:元のエラーメッセージに戻って、何かが正しく再構築されなかったか、binフォルダに到着しなかった – plankalkul

+0

「TestViewModel」登録にも同じことが当てはまります。 'Foo'を挿入したい場合は、' Foo'として登録する必要があります。 'IFoo'として登録されていれば、' Foo'として注入することはできません。 Autofacはそれを提供する方法を知らない。あなたの登録を1つずつ確認し、クラスが具体的なクラスではなく登録されたサービスに依存しているかどうかを再確認してください。 – Amy

+0

私はこのように注入されたビューモデルを見たことがないことを付け加えたいと思います。あなたがしようとしていることが可能か悪い習慣であるかどうかは分かりません...悪いことを言っているわけではありません。通常、モデルではなくサービスを注入します。 – Amy

関連する問題