Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 团结以名解决_C# 4.0_Unity Container_Enterprise Library_Factory_Factory Pattern - Fatal编程技术网

C# 4.0 团结以名解决

C# 4.0 团结以名解决,c#-4.0,unity-container,enterprise-library,factory,factory-pattern,C# 4.0,Unity Container,Enterprise Library,Factory,Factory Pattern,我试图让Unity成为工厂模式中的工厂,因此根据命名实例返回不同的接口实现。我有以下代码 公共静态类工厂 { 专用静态只读IUnityContainer容器 static Factory() { container = new UnityContainer(); container .AddNewExtension<EnterpriseLibraryCoreExtension>() .Ad

我试图让Unity成为工厂模式中的工厂,因此根据命名实例返回不同的接口实现。我有以下代码

公共静态类工厂 { 专用静态只读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);
    }
}
静态工厂()
{
容器=新的UnityContainer();
容器
.AddNewExtension()
.AddNewExtension()
.RegisterType()
//注册implementation1
.RegisterType(“implemantation1”)
.RegisterType(新的InjectionProperty(“服务器”,ConfigurationManager.AppSettings[“服务器]))
.RegisterType(新的InjectionProperty(“ServerPort”,int.Parse(ConfigurationManager.AppSettings[“Port”]))
.RegisterType(
新的拦截器(),
新的拦截行为(container.Resolve())
//注册implementation2
.RegisterType(“implemantation2”)
.RegisterType(新的InjectionProperty(“服务器”,ConfigurationManager.AppSettings[“服务器]))
.RegisterType(新的InjectionProperty(“端口”,int.Parse(ConfigurationManager.AppSettings[“端口]))
.RegisterType(
新的拦截器(),
新的拦截行为(container.Resolve())
;
}
///实例化数据提供程序类
公共静态T CreateFactory(字符串名称)
{
返回容器。解析(名称);
}
}
当我试图通过调用带有“implemantation2”或“implemantation1”的CreateFactory方法来解析容器时,我得到以下错误: InvalidOperationException-无法构造类型字符串。必须配置容器以提供此值

我不知道我做错了什么,任何帮助都将不胜感激

Josh,答案是

    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>()))
            ;
    }
静态工厂()
{
容器=新的UnityContainer();
容器
.AddNewExtension()
.AddNewExtension()
.RegisterType()
//注册implementation1
.RegisterType(“implemantation1”,新注入属性(“服务器”,ConfigurationManager.AppSettings[“服务器”]))
.RegisterType(“implemantation1”,新的InjectionProperty(“Port”,int.Parse(ConfigurationManager.AppSettings[“Port”]))
.RegisterType(“implemantation1”,
新的拦截器(),
新的拦截行为(container.Resolve())
//注册implementation2
.RegisterType(“implemantation2”,新注入属性(“WSIPServer”,ConfigurationManager.AppSettings[“WSIPServer”]))
.RegisterType(“implemantation2”,新注入属性(“WSIPServerPort”,int.Parse(ConfigurationManager.AppSettings[“WSIPServerPort]”)))
.RegisterType(“implemantation2”,
新的拦截器(),
新的拦截行为(container.Resolve())
;
}

您必须将所有注入设置放入寄存器调用中:

.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>()))
.RegisterType(
“执行1”,
新的InjectionProperty(“服务器”,ConfigurationManager.AppSettings[“服务器]),
新的InjectionProperty(“ServerPort”,int.Parse(ConfigurationManager.AppSettings[“Port”]),
新的拦截器(),
新的拦截行为(container.Resolve())

这不是唯一将
IMessageFactory
注册到
implementation1
new Interceptor(),new InterceptionBehavior(…)
名称
implementation1”吗
?除非我误解了
UnityContainer
的工作原理,这是完全可能的,并且我要求更正,否则我不知道您将如何使用
新的InjectionProperty(…)
实现
1