0

LogUtil コンストラクターは次のようになります。

    public LogUtil(object classType) 
    {

        ....
    }

私の次のコードは正しく動作します..

var container = new UnityContainer();
container.RegisterType<ILogUtility, LogUtil>(new InjectionConstructor(this.GetType()));
Logger logger = container.Resolve<Logger>();

構成ファイルのコンストラクター設定の構成に問題があります。コンテナー登録を次のように構成しました。

  <container>
    <register type="ILogUtility, Framework"
              mapTo="LogUtil, Log4Net">

        <constructor>
          <param name="classType" type="object">
          </param>
        </constructor>

    </register>
  </container>

上記構成ではコンストラクタの設定に問題があるようです。「タイプ」情報を正しく渡すことができません。実際のクラス型ではなく、「System.Object」として渡されます。上記のコンストラクター構成を修正するにはどうすればよいですか?

4

2 に答える 2

1

個人的には、コンストラクター インジェクションは使用しません。私はもっ​​とこのようなことをします:

public static class Log
{
    private static readonly object SyncLock = new object();
    private static ILogFactory _loggerFactory;

    private static void EnsureFactory()
    {
        if (_loggerFactory == null)
        {
            lock (SyncLock)
            {
                if (_loggerFactory == null)
                {
                    _loggerFactory = ServiceLocator.Get<ILogFactory>();
                }
            }
        }
    }

    public static ILogHandler For(object itemThatRequiresLogging)
    {
        if (itemThatRequiresLoggingServices == null)
            throw new ArgumentNullException("itemThatRequiresLogging");

        return For(itemThatRequiresLoggingServices.GetType());
    }

    public static ILogHandler For(Type type)
    {
        if (type == null)
            throw new ArgumentNullException("type");

        EnsureFactory();

        return _loggerFactory.CreateFor(type);
    }

    public static ILogHandler For<T>()
    {
        return For(typeof(T));
    }
}

次のように使用されます。

Log.For(this).Debug("Some Stuff to log.")); //Debug is defined in ILogHandler.

型は、コンストラクターではなく、メソッド呼び出しを介して渡されます。

于 2012-04-12T19:17:59.380 に答える
1

構成でこれを行うことができるとは思いません。これはより静的な設定であり、ランタイム リフレクションが必要です。ただし、オブジェクトはLogUtil親の型にキャストできる必要があります。あなたが試すことができることの1つは、ILoggableObjectインターフェースを作成することであり、そのようにパラメーターを設定できます。つまり、すべてのコントロールで使用できるメソッド/プロパティを探している場合です

于 2012-04-12T19:06:54.513 に答える