首页新闻找找看学习计划

使用Unity配置文件映射出错

0
悬赏园豆:15 [已解决问题] 解决于 2012-09-11 09:08

初次使用Unity框架,在用代码配置写Demo的时候成功执行,但是当使用配置文件映射时总是提示名字不能被解析,反复看找不出原因,请大家帮忙看看。

以下是C#代码(控制台应用程序,测试代码全部写在Program.cs里面)

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            UnityConfigurationSection config = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
            config.Configure(container);
            //container.RegisterType<ILogger, DatabaseLogger>();
            ILogger logger = container.Resolve<ILogger>();
            logger.Write("Hello world!");
        }
    }

    public interface ILogger
    {
        void Write(string message);
    }
    public class DatabaseLogger : ILogger
    {
        [Dependency]
        public ILogger Logger { get; set; }
        public void Write(string message)
        {
            Console.WriteLine(String.Format("Message:{0}", message));
            Console.WriteLine("Target:Database");
        }
    }
}

以下是App.config配置文件内容

<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity>
    <containers>
      <container>
        <types>
          <type type="ConsoleApplication.ILogger" mapTo="ConsoleApplication.DatabaseLogger"/>
        </types>
      </container>
    </containers>
  </unity>
</configuration>

错误提示内容:

未处理的异常: System.InvalidOperationException: The type name or alias ConsoleA
pplication.ILogger could not be resolved. Please check your configuration file a
nd verify this type name.
在 Microsoft.Practices.Unity.Configuration.ConfigurationHelpers.TypeResolverI
mpl.ResolveType(String typeNameOrAlias, Boolean throwIfResolveFails)
...

^沙嘉^的主页 ^沙嘉^ | 菜鸟二级 | 园豆:326
提问于:2012-07-10 22:49
< >
分享
最佳答案
0

只写类型名称是不够,还要写Assembly的名称(一般是dll的名称),

可以参考:http://q.cnblogs.com/q/38001/

收获园豆:15
dudu | 高人七级 |园豆:38722 | 2012-07-11 08:56

感谢dudu老大关注

如果将<type>节点加上程序集名称,如这样

<type type="ConsoleApplication.ILogger,ConsoleApplication" mapTo="ConsoleApplication.DatabaseLogger,ConsoleApplication"/>

这样会报错:Process is terminated due to StackOverflowException.

按照你指示的帖子加上Version=...(这个是程序集的元数据吗)报"无法加载程序集错误"。

另外,问一个额外的问题。搜索院子里的Unity资料,大部分是Unity 1.2,我自己用的是2.1。按照网友的一张结构图配置(地址:http://images.cnblogs.com/cnblogs_com/springyangwc/201205/2012051717393897.jpg)的,但发现有些人的配置都不用type,而用帖子里所说的register节点。请问是映射结构更新了吗?有没有比较形象的映射结构图?

^沙嘉^ | 园豆:326 (菜鸟二级) | 2012-07-11 09:25

@青銅碼鬥士: 我们用Unity,不用任何配置文件,用配置文件的缺点就是容易出错,出错时也很难查错。

dudu | 园豆:38722 (高人七级) | 2012-07-11 09:28

@dudu: 这是事实,因为缺少IDE的支持,修改一个类名都要手动去修改各种XML文件。但辩证地看,使用配置文件带来的优势也挺多的(如果我要映射20个类,那这都额外写多少代码)。看园子里的评论,有人说不用配置文件,使用Unity都没什么意义。

博问人气不高,问题还是未解决

^沙嘉^ | 园豆:326 (菜鸟二级) | 2012-07-11 10:32
其他回答(1)
0

算了,自己搞了

^沙嘉^ | 园豆:326 (菜鸟二级) | 2012-09-11 09:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册