带有泛型的Unity 2.0 XML配置

时间:2010-10-23 20:06:03

标签: generics configuration unity-container

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


<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

3 个答案:

答案 0 :(得分:2)

我认为你需要在声明别名时指定哪种类型是通用的。 我已经完成了How to inject a generic IList<> of objects using Unity 2 XML config?的示例,如下所示。

列表假设您要使用“IList”中的“解析”到“列表”。

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();
        }
    }
}

那应该够了,我希望这个有用;-) 最好的祝福, 数量锐减

答案 1 :(得分:0)

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

答案 2 :(得分:0)

配置文件应由人类阅读,因此不会让您的生活变得困难。 以下行很难维护

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