0

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 の継承に関係していると思います...

これを修正する方法を知っている人はいますか?

よろしく、リック

4

1 に答える 1

1

[]表記の代わりにこれを試してください

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

ぎこちなく感じますが、うまくいくはずです。

于 2013-09-12T14:30:26.590 に答える