SORU
10 AĞUSTOS 2010, Salı


Bağımlılık enjeksiyon ve zararlılarına adlı

Daha fazla insan bağımlılık enjeksiyon platformları ile günlük enjekte nasıl öğrenmeye ilgi duyuyorum. Linkleri aşağıda ve bana örnek log4net ve Birlik için başvuran, ancak, mutlaka o da kullanacak değilim. Bağımlılık enjeksiyon/IOC için, muhtemelen bu projenin geriye kalan kısmı (büyük) yerleşme üzerinde standart olarak MEF kullanacağım.

Bağımlılık enjeksiyon/ıoc için çok yeni ve ben C am güzel# ve .(C) çok küçük üretim kodu#/yazdım.NET VC6 ve VB6 geçtiğimiz 10 yıl sonra veya çok NET). Mevcut günlük çözümler içine soruşturma bir sürü iş var, özellik setleri iyi bir kolu olduğunu düşünüyorum. Sadece bir bağımlılık (ya da, belki de "doğru" bir bağımlılık soyutlanmış bir sürümünü elde enjekte). daha fazla enjekte alma gerçek mekaniği aşina mıyım

Diğer mesaj ve/veya bağımlılık enjeksiyon gibi günlüğü ile ilgili gördüm: http://stackoverflow.com/questions/522370/dependency-injection-and-logging-interfaces

http://stackoverflow.com/questions/576185/logging-best-practices

http://stackoverflow.com/questions/166438/what-would-a-log4net-wrapper-class-look-like

http://stackoverflow.com/questions/1320844/again-about-log4net-and-unity-ioc-config

Benim sorum özellikle "ben Nasıl platform xxx yyy ıoc aracı kullanarak günlük enjekte etmek?" ile bir ilgisi yok Daha doğrusu, platformu (genellikle, ama her zaman önerilmez) ve yapılandırma günlüğü (yani app.sarma insanları ele ilgileniyorum config). Örneğin, bir örnek olarak log4net kullanarak yapılandırma (app.config) kaydediciler ve daha sonra bir dizi bu kaydediciler (bağımlılık enjeksiyon) olmadan bu kodu kullanarak standart bir şekilde:

private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Eğer benim logger fonksiyonel bir alan için bir sınıf için adlandırılmış, ancak bunun yerine, değilse, alternatif olarak, bunu yapabilirim:

private static readonly ILog logger = LogManager.GetLogger("Login");
private static readonly ILog logger = LogManager.GetLogger("Query");
private static readonly ILog logger = LogManager.GetLogger("Report");

Bu yüzden, bu benim sanırım "" bu gibi bir şey olacaktır: . gereksinimleri

  1. Günlüğü bir platform üzerinde doğrudan bir bağımlılık benim ürünün kaynağı izole etmek istiyorum.

  2. Ben orada olmak istiyor mümkün çözmek için bir özel adlı logger örneği (muhtemelen paylaşım aynı örnek arasında tüm isteyenlere aynı adlı örnek) ya doğrudan ya da dolaylı olarak bir tür bağımlılık enjeksiyon, muhtemelen MEF.

  3. Eğer bu sabit bir gereklilik diyebilir miyim bilmiyorum, ama adında bir logger (sınıf logger daha farklı) talep almak için yeteneği istiyorum. Örneğin, benim sınıf için bir logger sınıf adına göre yaratabilirim, ama bir yöntemi ayrı ayrı kontrol etmek istiyorum özellikle ağır teşhis gerekiyor. Diğer bir deyişle, tek bir sınıf "" iki ayrı logger örnekleri. bağımlı olmak isteyebilirim

Numara 1 ile başlayalım. Makaleler, öncelikle burada stackoverflow üzerinde, ya da sarmak için iyi bir fikir olup olmadığı hakkında bir dizi okudum. "En iyi uygulamalar" ve üzeri jeffrey hantin'nin kötü log4net sarmak için neden bir görünüm için bir yorum. bağlantı gidip bakın Eğer sen yaptıysan sararsan etkili wrap) Eğer (ve kesinlikle enjeksiyon amacı/doğrudan depdency kaldırılması için şal ister misin? Ya da uzak log4net app bazı veya tüm soyut için çalışacağını söyledi.bilgi yapılandırma?

Hadi Sistemi kullanmak istiyorum diyelim.Teşhis, muhtemelen arayüzü tabanlı bir logger (belki de "ortak" ILogger/Nehir arayüzü), enjekte edebilirim böylece muhtemelen TraceSource dayanarak, kullanarak uygulamak isterim Arabirimi uygulamak, TraceSource ki, sadece Sistemi kullanmak istiyorsunuz.Tanılama uygulaması.bilgi yapılandırma olarak mı?

Şöyle bir şey:

public class MyLogger : ILogger
{
  private TraceSource ts;
  public MyLogger(string name)
  {
    ts = new TraceSource(name);
  }

  public void ILogger.Log(string msg)
  {
    ts.TraceEvent(msg);
  }
}

Ve aşağıdaki gibi kullanabilirsiniz:

private static readonly ILogger logger = new MyLogger("stackoverflow");
logger.Info("Hello world!")

Sayı üstünde hareket eden özel logger örneği adlı çözmek için Nasıl 2...? Sadece kaldıraç uygulaması gerekiyor.seçtiğim platform günlük (yani app kaydediciler adlandırma şeması dayalı gidermek.bilgi yapılandırma config)? Yani, log4net, "" (bu statik bir nesne olduğu için mümkün olmadığını biliyorum unutmayın) LogManager? enjekte etmek için tercih olabilir bu durumda LogManager (MyLogManager çağrı tamamlamış, İLogManager bir arayüz verin ve MyLogManager gidermek.İLogManager arayüzü. Benim diğer nesneleri bir depenency (MEF dilinde Alma) İLogManager (uygulanan nerede derlemesinden Verme) olabilir. Şimdi bu gibi nesneler olabilir:

public class MyClass
{
  private ILogger logger;
  public MyClass([Import(typeof(ILogManager))] logManager)
  {
    logger = logManager.GetLogger("MyClass");
  }
}

Her zaman İLogManager denir, doğrudan log4net. LogManager temsilci olur. Alternatif olarak, sarılmış LogManager bu ILogger uygulama esas alır örneklerini alabilir.config ve onları (?) eklemek Adı konteyner MEF. Aynı adı taşıyan bir logger istendiğinde, daha sonra sarılmış LogManager bu ismi sorgulanır. Eğer ILogger varsa, bu şekilde çözümlenir. Eğer bu MEF ile mümkün değilse, herhangi bir yararı ne işin var orada?

Bu durumda, gerçekten, sadece İLogManager "enjekte" ve log4net normalde. bu şekilde ILogger örnekleri el olabilir. Nasıl enjeksiyon bu tür bir fabrika aslında) logger örnekleri adlı enjekte farkı nedir? Bu log4net (ya da diğer günlük platform) uygulaması daha kolay kullanmak için izin verir.yapılandırma dosyası.

Örnekleri böyle MEF kaba adlı alabilirim biliyorum:

var container = new CompositionContainer(<catalogs and other stuff>);
ILogger logger = container.GetExportedValue<ILogger>("ThisLogger");

Ama nasıl kabın içine adlandırılmış kopyaları alabilirim? Her adlı ILogger, farklı uygulamaları (MEF öznitelik) olabileceği öznitelik tabanlı modeli hakkında biliyorum, ama bu gerçekten bana yardımcı olmuyor. Bir şekilde bir uygulama gibi bir şey yaratmak için vardır.bu isimde kaydediciler (aynı uygulama tüm listesini ve MEF okuyabilir config (veya bir bölümü orada)? /A orta "(MyLogManager gibi) giderir temel uygulaması ile loggers adlı." yönetici olmalı diye config ve sonra ekler MEF kabın içine çözülmüş logger? Bu şekilde aynı MEF konteyner (log4net bu Uygulamayı kullanmak için nasıl MyLogManager bilgisi olmadan rağmen.erişimi olan başka biri için kullanılabilir olacaktır config bilgi, kabın herhangi bir loggers adlı çözmek mümkün olacak gibi görünüyor doğrudan).

Bu zaten oldukça uzun zaman aldı. Tutarlı olduğunu umarım. (Büyük olasılıkla log4net, NLog, ya da bir şey (umarım) ince Sistem üzerine inşa düşünüyoruz.hissediyorum bağımlılık günlüğü bir platform enjekte hakkında herhangi bir bilgi paylaşmak için ücretsiz lütfen Tanılama) içine uygulama.

Bu enjekte ettin "müdür" ve logger örnekleri dönüş var?

Mü ekleyin biraz kendi config bilgileri kendi config bölümünde senin Dİ platform config bölümünde yapmak daha kolay/mümkün enjekte logger örnekleri doğrudan (yani yapmak bağımlılıklar üzerine ILogger yerine İLogManager).

Ne de içinde İLogManager arabirimi veya ILogger örnekleri adlı ayarlanmış statik veya global bir konteyner olmasıyla ilgili. Yani, geleneksel anlamda (mülkiyet, ya da üye veri kurucu) enjekte yerine, günlük bağımlılık açıkça talep giderilmiştir. Bu bağımlılık enjekte etmek için iyi ya da kötü bir şekilde.

Bir topluluk kesin bir cevabı olmayan bir soru gibi görünmüyor beri wiki olarak bu işaret ediyorum. Eğer aksini düşünüyorsa, bunu değiştirmek için çekinmeyin.

Herhangi bir yardım için teşekkür ederiz!

CEVAP
26 HAZİRAN 2011, Pazar


Ninject bu gibi örnek: logger için geçerli bir sınıf adı çözümlemek için kullanıyorum

kernel.Bind<ILogger>().To<NLogLogger>()
  .WithConstructorArgument("currentClassName", x => x.Request.ParentContext.Request.Service.FullName);

NLog bir Uygulama oluşturucu şöyle:

public NLogLogger(string currentClassName)
{
  _logger = LogManager.GetLogger(currentClassName);
}

Bu yaklaşım diğer IOC konteyner ile bir iş yapacaktır, sanırım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • arnejann

    arnejann

    3 Kasım 2007
  • bashirsultani

    bashirsultan

    22 Mart 2010
  • Rockstar Games

    Rockstar Gam

    17 ŞUBAT 2006