【问题标题】:Unity 2.0 XML configuration with genericsUnity 2.0 XML 配置与泛型
【发布时间】:2010-10-23 20:06:02
【问题描述】:

这是对我关于 Unity 的另一篇文章的跟进 (http://stackoverflow.com/questions/3998559/irepository-iservice-unity-in-an-asp-net-mvc-application-reference-question) .基本上我正在尝试在 web.config 中注册一个泛型类型。我已经阅读了一些帖子,这似乎是正确配置的。


<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
 <alias alias="IService" type="Porject.Service.IService`1, Porject.Service" />
 <alias alias="PropertyService" type="Porject.Service.PropertyService, Porject.Service"/>

 <container>
  <register type="IService[Property]" mapTo="PropertyService" />
 </container>
</unity>

但我收到此错误:

“/”应用程序中的服务器错误。

无法解析类型名称或别名 IService[Property]。请检查您的配置文件并验证此类型名称。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.InvalidOperationException:无法解析类型名称或别名 IService[Property]。请检查您的配置文件并验证此类型名称。

来源错误:

第 33 行: 第 34 行:UnityConfigurationSection 部分 = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); 第 35 行:section.Configure(_container); 第 36 行: 第 37 行:

源文件:D:\Projects\Ex2\NCI\TREB\src\WebUI\UnityControllerFactory.cs 行:35

【问题讨论】:

    标签: generics configuration unity-container


    【解决方案1】:

    我认为您需要在声明别名时指定使用的泛型类型。 我为How to inject a generic IList<> of objects using Unity 2 XML config? 做了一个示例,如下所示。

    List 假设您想使用从“IList”到“List”的解析。

    1首先,您必须准备配置文件,在这种情况下,它使用对 IList 和 List 的签名引用。

    
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
      </configSections>
      <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
        <alias alias="StringListContract" type="System.Collections.Generic.IList`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <alias alias="ConcreteStringList" type="System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <container>
          <register type="StringListContract" mapTo="ConcreteStringList">
            <lifetime type="ContainerControlledLifetimeManager" />
            <constructor />
          </register>
        </container>
      </unity>
    </configuration>
    

    2 使用容器解决依赖关系;-)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Practices.Unity;
    using Microsoft.Practices.Unity.Configuration;
    namespace UnityTerminal
    {
    
    
        class Program
        {
            static void Main(string[] args)
            {
                var container = new UnityContainer();
                container.LoadConfiguration();
                {
                    var concreteStringList = container.Resolve<System.Collections.Generic.IList<System.String>>();
                    concreteStringList.Add("Hello World");
                }
                {
                    var concreteStringList = container.Resolve<System.Collections.Generic.IList<System.String>>();
                    Console.WriteLine("{0}", concreteStringList[0]);
                }
                Console.ReadKey();
            }
        }
    }
    

    这应该足够了,我希望这有效 ;-) 最好的祝福, 赫伯

    【讨论】:

      【解决方案2】:

      类型属性没有别名或命名空间/程序集快捷方式。这种类型在哪里定义?修复它,它应该可以工作。

      【讨论】:

        【解决方案3】:

        配置文件是供人类阅读的,因此不会让您的生活变得困难。 下面这行真的很难维护

        <alias alias="IService" type="Porject.Service.IService`1, Porject.Service" />
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多