Unity无法通过xml配置加载泛型类型定义

时间:2013-09-12 14:12:37

标签: c# xml generics unity-container

我遇到了通过XML配置配置Unity 3.0的一些问题。解析泛型类型将给出以下异常消息:

  

INLog`1类型没有可访问的构造函数。

这是我的日志记录类的布局:

namespace Common.Utils.Logging {
    public interface INLog
    {
    }

    public interface INLog<T> : INLog where T : class
    {
    }

    public class NLog : INLog
    {
        public NLog(Type type)
        {
        }
    }

    public class NLog<T> : NLog, INLog<T>
        where T : class
    {
        public NLog()
            : base(typeof(T))
        {
        }
    }
}

我使用此XML代码注册泛型类型:

<type type="Common.Utils.Logging.INLog[], Common.Utils" mapTo="Common.Utils.Logging.NLog[], Common.Utils" />

加载此配置会为我提供以下容器注册:

LifetimeManager: {Microsoft.Practices.Unity.TransientLifetimeManager}
LifetimeManagerType: {Name = "TransientLifetimeManager" FullName = "Microsoft.Practices.Unity.TransientLifetimeManager"}
MappedToType: {Name = "NLog[]" FullName = "Common.Utils.Logging.NLog[]"}
Name: null
RegisteredType: {Name = "INLog[]" FullName = "Common.Utils.Logging.INLog[]"}

而不是我期待的注册,即:

LifetimeManager: null
LifetimeManagerType: {Name = "TransientLifetimeManager" FullName = "Microsoft.Practices.Unity.TransientLifetimeManager"}
MappedToType: {Name = "NLog`1" FullName = "Common.Utils.Logging.NLog`1"}
Name: null
RegisteredType: {Name = "INLog`1" FullName = "Common.Utils.Logging.INLog`1"}

在代码中注册工作正常并提供预期的注册:

using (IUnityContainer container = new UnityContainer())
{
    container.RegisterType(typeof(INLog<>), typeof(NLog<>));
}

但是我无法通过配置文件正确加载它。 我想这必须与非泛型类型的继承(I)NLog ...

你们其中任何人都知道如何解决这个问题吗?

祝你好运, 瑞克

1 个答案:

答案 0 :(得分:1)

尝试使用此代替[]符号

<type type="Common.Utils.Logging.INLog`1, Common.Utils" mapTo="Common.Utils.Logging.NLog`1, Common.Utils" />

我知道,感觉很尴尬,但它应该有用。