2012-11-16 13 views
14

私はMVC3のAutofacで作業していました。今私はそれをMVC4で実装しようとしています。MVC4のAutofac:コントローラにデフォルトのコンストラクタがありません

私は私のIoCコンテナを調整

(Autofac.Mvc4 -pre-のパッケージをインストールし、インストール・パッケージAutofac.WebApi -pre)をパッケージマネージャコンソールを使用してAutofac MVC4とAutofac WEBAPIのプレリリース版をインストール

private static void SetAutofacContainer() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

     builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest().InstancePerApiRequest(); 
     builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerHttpRequest().InstancePerApiRequest(); 
     builder.RegisterType<RepositoryWrapper>().As<RepositoryWrapper>().InstancePerHttpRequest().InstancePerApiRequest(); 
     builder.RegisterType<ServiceWrapper>().As<ServiceWrapper>().InstancePerHttpRequest().InstancePerApiRequest(); 

     // Repositories 
     builder.RegisterAssemblyTypes(typeof(UserRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest(); 

     // Services 
     builder.RegisterAssemblyTypes(typeof(UserService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest(); 

     IContainer container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
     GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

    } 

私は(APIコントローラにアクセスすることにより)アプリケーションを実行すると、私は例外を取得:

Controllers.UserControllerは、」デフォルトコンストラクタを持っていない」として、次の

コントローラは次のようになります。

namespace Controllers 
{ 
[Authorize] 
public class UserController : ApiController 
{ 
    private ServiceWrapper _services; 

    public UserController(ServiceWrapper services) 
    { 
     _services = services; 
    } 

    // GET api/user/{userrequest} 
    public IQueryable<User> Get(UserRequest request) 
    { 
     if (ModelState.IsValid) 
     { 
      '... 
     } 
    } 
} 

私は何かが足りないのですか?私はそれを正しく設定していませんでしたか?どんな助けでも大歓迎です!

更新

マイAPIコントローラは、同じソリューション内の別のプロジェクト内にあります。私がメインのMVCプロジェクトにAPIコントローラを置くと、それは機能します。誰かが私のAPIプロジェクトでAPIコントローラを登録する方法を私に教えてもらえますか?

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

レジスタApiControllers現在のアセンブリ(プロジェクト)から:(そのアセンブリ内で)それはあなたのApiControllers

だから、次の呼び出しを探す必要がありますあなたがAutofacを伝えるRegisterApiControllers方法で

+0

usercontrollerクラスを表示できますか? –

+0

どこから 'SetAutofacContainer'メソッドを呼び出しますか? – nemesv

+0

Application_Start()in Global.asax – Vocte

答えて

23

。あなたが別のプロジェクトにもApiController秒を持っている場合は

あなたはこのようにそれを使用する必要があります。

意味
builder.RegisterApiControllers(typeof(UserController).Assembly); 

は:すべてApiController形アセンブリ(プロジェクト)UserController命を登録します。アセンブリ(プロジェクト)内に複数のApiControllerがある場合でも、アセンブリごとに1つだけRegisterApiControllersが必要です。

+0

ありがとうございます。それはトリックでした! – Vocte

+0

あなたは 'RegisterControllers'を意味しますか? 'RegisterApiControllers'メソッドはないようです。 – drozzy

+3

@drozzy MVCコントローラの場合は 'RegisterControllers'、web.apiコントローラの場合は' RegisterApiController'の2つのメソッドがあります。 'RegisterApiController'は、Autofac.WebAPi拡張を使用する場合にのみ利用可能です。 – nemesv

関連する問題