3

私はこの設定をしています:

public static void Initialize(ISessionFactory factory)
{
    var container = new Container();
    InitializeContainer(container, factory);
    container.RegisterMvcControllers(
        Assembly.GetExecutingAssembly());
    container.RegisterMvcAttributeFilterProvider();
    container.Verify();
    DependencyResolver.SetResolver(
        new SimpleInjectorDependencyResolver(container));
}

private static void InitializeContainer(
    Container container, ISessionFactory factory)
{
    container.RegisterPerWebRequest<ISession>(
        () => factory.OpenSession(), true);
}

Initializeメソッドは次の場所で呼び出されApplication_Startます。

public class WebApiApplication : HttpApplication
{
    protected void Application_Start()
    {
        SimpleInjectorInitializer.Initialize(
            new NHibernateHelper(
                Assembly.GetCallingAssembly(), 
                this.Server.MapPath("/"))
                .SessionFactory);

        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

しかし、コントローラーアクションを呼び出そうとすると、次のようになりますArgumentException

タイプ'PositionReportApi.Controllers.PositionsController'にはデフォルトのコンストラクターがありません

スタックトレース:

System.Linq.Expressions.Expression.New(Type type)at System.Web.Http.Internal.TypeActivator.Create [TBase](Type instanceType)at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request、HttpControllerDescriptor controllerDescriptor、Type controllerType)

登録できませんISession

工場で作成されたISessionを登録するにはどうすればよいですか?

4

1 に答える 1

6

スタックトレースから、新しい.NET 4.5 ASP.NET Web APIを使用していて、SimpleInjectorが表示されたコールグラフに含まれていないことがわかります。これはおそらく、MVCに必要な登録とは異なる登録である新しいWebAPIで使用するためにSimpleInjectorを構成していないことを意味します(奇妙な理由で、最終リリースでこれが修正されることを心から願っています)。SimpleInjector固有のSystem.Web.Http.Dependencies.IDependencyResolver実装をWebAPIに登録しなかったGlobalConfiguration.Configuration.DependencyResolverため、デフォルトの動作が得られます。これは、デフォルトのコンストラクターでのみ機能します。

このStackoverflowの回答をご覧くださいSimpleInjectorはMVC4ASP.NET Web APIをサポートしていますか?新しいASP.NETWebAPIを使用してSimpleInjectorを構成する方法を確認します。

アップデート

正しく構成した場合でもこの例外が発生する可能性があることに注意してください。ただしDependencyResolver、登録しなかった場合は、WebAPIコントローラーを明示的に登録してください。これは、WebAPIの設計方法が原因です。

コントローラは常に明示的に登録してください。

于 2012-07-05T17:02:36.477 に答える