15

私は MVC3 で Autofac を使用しており、気に入っています。現在、MVC4で実装しようとしています。

パッケージ マネージャー コンソール (Install-Package Autofac.Mvc4 -Pre および Install-Package Autofac.WebApi -Pre) を使用して、Autofac MVC4 および Autofac WebApi のプレリリース バージョンをインストールしました。

IoC コンテナーを次のように調整しました。

    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 コントローラーを配置すると、機能します。Autofac で API コントローラーを API プロジェクトに登録する方法を教えてください。

4

1 に答える 1

25

メソッドを使用して、 RegisterApiControllersAutofac にどこ (どのアセンブリ) を探すべきかを伝えます。ApiControllers

したがって、次の呼び出し:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

ApiControllers現在のアセンブリ (プロジェクト) から を登録します。

別のプロジェクトにも s がある場合はApiController、次のように使用する必要があります。

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

つまり、 が住んでいるアセンブリ (プロジェクト) のすべてのフォームを登録します。そのため、アセンブリ (プロジェクト) に複数ある場合でも、アセンブリごとに 1 つだけ必要です。ApiControllerUserControllerRegisterApiControllersApiController

于 2012-11-17T08:33:12.057 に答える