1

Unity をファクトリー パターンのファクトリーにしようとしているため、名前付きインスタンスに応じてインターフェイスのさまざまな実装を返します。次のコードがあります

public static class Factory { private static readonly IUnityContainer コンテナー。

    static Factory()
    {
        container = new UnityContainer();
        container
            .AddNewExtension<EnterpriseLibraryCoreExtension>()
            .AddNewExtension<Interception>()
            .RegisterType<IInterceptionBehavior, LoggingBehaviour>()

            //register the implemantation1
            .RegisterType<IMessageFactory, implemantation1>("implemantation1")
            .RegisterType<IMessageFactory, implemantation1>(new InjectionProperty("Server", ConfigurationManager.AppSettings["Server"]))
            .RegisterType<IMessageFactory, implemantation1>(new InjectionProperty("ServerPort", int.Parse(ConfigurationManager.AppSettings["Port"])))
            .RegisterType<IMessageFactory, implemantation1>(
                new Interceptor<InterfaceInterceptor>(),
                new InterceptionBehavior(container.Resolve<IInterceptionBehavior>()))

            //register the implemantation2
            .RegisterType<IMessageFactory, implemantation2>("implemantation2")
            .RegisterType<IMessageFactory, implemantation2>(new InjectionProperty("Server", ConfigurationManager.AppSettings["Server"]))
            .RegisterType<IMessageFactory, implemantation2>(new InjectionProperty("Port", int.Parse(ConfigurationManager.AppSettings["Port"])))
            .RegisterType<IMessageFactory, implemantation2>(
                new Interceptor<InterfaceInterceptor>(),
                new InterceptionBehavior(container.Resolve<IInterceptionBehavior>()))
            ;
    }

    /// Instantiates a data provider class
    public static T CreateFactory<T>(string name)
    {
        return container.Resolve<T>(name);
    }
}

「implementation2」または「implementation1」で CreateFactory メソッドを呼び出してコンテナーを解決しようとすると、次のエラーが発生します。 InvalidOperationException - タイプ String を構築できません。この値を提供するようにコンテナーを構成する必要があります。

私が何を間違っているのかわかりません。どんな助けでも大歓迎です。

ジョシュ

4

2 に答える 2

0

そして答えは……。

    static Factory()
    {
        container = new UnityContainer();
        container
            .AddNewExtension<EnterpriseLibraryCoreExtension>()
            .AddNewExtension<Interception>()
            .RegisterType<IInterceptionBehavior, LoggingBehaviour>()

            //register the implemantation1
            .RegisterType<IMessageFactory, implemantation1>("implemantation1", new InjectionProperty("Server", ConfigurationManager.AppSettings["Server"]))
            .RegisterType<IMessageFactory, implemantation1>("implemantation1", new InjectionProperty("Port", int.Parse(ConfigurationManager.AppSettings["Port"])))
            .RegisterType<IMessageFactory, implemantation1>("implemantation1",
                new Interceptor<InterfaceInterceptor>(),
                new InterceptionBehavior(container.Resolve<IInterceptionBehavior>()))

            //register the implemantation2
            .RegisterType<IMessageFactory, implemantation2>("implemantation2", new InjectionProperty("WSIPServer", ConfigurationManager.AppSettings["WSIPServer"]))
            .RegisterType<IMessageFactory, implemantation2>("implemantation2", new InjectionProperty("WSIPServerPort", int.Parse(ConfigurationManager.AppSettings["WSIPServerPort"])))
            .RegisterType<IMessageFactory, implemantation2>("implemantation2",
                new Interceptor<InterfaceInterceptor>(),
                new InterceptionBehavior(container.Resolve<IInterceptionBehavior>()))
            ;
    }
于 2012-08-31T05:05:48.767 に答える
0

すべての注入設定を登録呼び出しに入れる必要があります。

.RegisterType<IMessageFactory, implemantation1>(
          "implemantation1",
          new InjectionProperty("Server", ConfigurationManager.AppSettings["Server"]),
          new InjectionProperty("ServerPort", int.Parse(ConfigurationManager.AppSettings["Port"]),
          new Interceptor<InterfaceInterceptor>(),
          new InterceptionBehavior(container.Resolve<IInterceptionBehavior>()))
于 2012-09-03T22:29:26.097 に答える