8

「BigEye.Business」という名前の dll を登録しようとしており、そのファイルを mvc 3 プロジェクトに参照しました。しかし、そのdllでオブジェクトのインスタンスを取得しようとすると、autofacは登録されていないと言います。オブジェクトを登録して解決する方法は次のとおりです。

private static IContainer SetDIContainer()
        {
            var builder = new ContainerBuilder();
            builder.RegisterControllers(Assembly.GetExecutingAssembly());
            builder.RegisterType<UserAuthManager>().As<IUserAuth>().InstancePerHttpRequest();
            builder.RegisterType<SessionManager>().As<ISession>().InstancePerHttpRequest();


            //Here is the code to register that dll
            var services = Assembly.Load("BigEye.Business");
            builder.RegisterAssemblyTypes(services);
            IContainer container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            return container;
        }

        public static T GetInstance<T>()
        {
            IContainer container = SetDIContainer();

            using(var httpRequestScope = container.BeginLifetimeScope("httpRequest"))
            {
                return httpRequestScope.Resolve<T>();
            }

        }

GetInstance 関数を呼び出すと、「要求されたサービス 'BigEye.Interfaces.Business.IUser' は登録されていません」というメッセージが表示されます。すべてのコンポーネントを Business dll に登録する必要がありますか? それを行う方法はありますか?ビジネスのオブジェクトとサービスは時間とともに変化するためです。

ありがとう

4

1 に答える 1

9

アセンブリには、IUserインターフェイスの 1 つ以上の実装が含まれていると思います。今、実行すると:

 builder.RegisterAssemblyTypes(services);

追加のパラメーターを使用しないと、実際にはclass によってキー設定されたアセンブリ内のすべての型を登録しています。おそらく、この解決が機能することがわかります。

GetInstance<SomeSpecificUserImplementation>();

インターフェイスによってサービスをキーにするには、次の手順を実行します。

  builder.RegisterAssemblyTypes(services).AsImplementedInterfaces();

これで、すべてのサービスは、特定のクラスではなく、それらが実装するインターフェースによってキー付けされるため、次のように機能します。

GetInstance<IUser>();
于 2012-05-10T09:26:57.440 に答える