2

ドメイン オブジェクトで log4net を直接使用するのは悪い習慣なのかどうか疑問に思っています... ASP.NET MVC アプリケーション側の例外には ELMAH を使用しますが、いくつかの情報目的でいくつかのデータをログに記録したいと考えています。ドメインモデル自体について。

次のドメイン オブジェクトがあるとします。

   public class Buyer
{
    private int _ID;
    public int ID
    {
        get { return _ID; }
        set
        {
            _ID = value;
        }
    }

    private IList<SupportTicket> _SupportTickets=new List<SupportTicket>();
    public IList<SupportTicket> SupportTickets
    {
        get
        {
            return _SupportTickets.ToList<SupportTicket>().AsReadOnly();
        }
    }

    public void AddSupportTicket(SupportTicket ticket)
    {
        if (!SupportTickets.Contains(ticket))
        {
            _SupportTickets.Add(ticket);
        }
    }
}

AddSupportTicketMethod にロギング動作を追加するのは悪い考えです...基本的には次のようになります。

       public class Buyer
{
    protected static readonly ILog log = LogManager.GetLogger(typeof(SupportTicket));

    public Buyer()
    {
       log4net.Config.XmlConfigurator.Configure();
    }


    private int _ID;
    public int ID
    {
        get { return _ID; }
        set
        {
            _ID = value;
        }
    }

    private IList<SupportTicket> _SupportTickets=new List<SupportTicket>();
    public IList<SupportTicket> SupportTickets
    {
        get
        {
            return _SupportTickets.ToList<SupportTicket>().AsReadOnly();
        }
    }

    public void AddSupportTicket(SupportTicket ticket)
    {
        if (!SupportTickets.Contains(ticket))
        {
            _SupportTickets.Add(ticket);
        } else {
           log.Warn("Duplicate Ticket Not Added.");
        }
    }
}
4

4 に答える 4

3

ドメインオブジェクトでlog4netとlog4Jを直接使用しました。これには良い副作用と悪い副作用があります。

  • + : ドメイン オブジェクトへのログインは単純で簡単にコーディングでき、log4net の機能を利用できることがわかっています。
  • -- : これは、ドメイン オブジェクトを使用するプログラムが log4net 構成に注意を払う必要があることを意味します。これは、問題になる場合とそうでない場合があります。
  • -- : ドメイン オブジェクトを、呼び出しプログラムが使用しているバージョンとは異なる log4net バージョンにリンクすることはできません。log4net 1.2.0.10 に対してリンクされた 1 つのアイテムと、以前のリリースに対してリンクされた別のアイテムとの多くの競合を見てきました。

ドメイン オブジェクトにログインしないのは悪い考えです。別の方法は、他の人が示唆しているように、依存性注入または外部フレームワーク (log4J の commons-logging など) を使用して、さまざまなロギング フレームワークをプラグインしたり、そのインターフェースに対してロギングおよびロギングを行うインターフェースを作成したりすることです。(ドメイン オブジェクトを使用するコードは、ログの目的でそのインターフェイスの適切なインスタンスを提供する必要があります。)

于 2009-04-23T23:04:03.957 に答える
1

これは古典的な質問です!

これを行う良い方法は、ILogger 型のクラス メンバーを導入し、このインターフェイスへのログ記録を抽象化することです。あなたのクラスでは、logg 何かを呼び出す場所はどこでも、このインターフェースを介してそれを行います。次に、利用可能な IoC コンテナまたは依存性注入ファームワークの 1 つを使用して、実装の 1 つを使用して実行時にこの依存性を注入します。デフォルトでは、このインターフェースの log4net 実装を使用できます。

利用可能な依存性注入フレームワークの長いリストは次のとおりです: http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx

于 2009-04-23T22:46:56.417 に答える
0

ロギングは横断的な関心事だと思うので、アスペクト指向の方法で行うのが最善です。Spring.NET のようなフレームワークを使用している場合は、それを利用できます。

于 2009-04-23T22:48:22.293 に答える