2012-10-16 11 views
5

Mam niestandardowy ErrorLog ELMAH który wykorzystuje kontekst EF Kod pierwszego do przechowywania błędów: -Jak mogę wstrzykiwać zależności do niestandardowej listy błędów ELMAH?

class EntityFrameworkElmahErrorLog 
{ 
    public EntityFrameworkElmahErrorLog(IDictionary config) : this() { } 

    public override ErrorLogEntry GetError(string id) 
    { 
     using (var context = new MyContext()) 
     { 
      var intId = Int64.Parse(id, CultureInfo.InvariantCulture); 
      var item = context.ErrorLog.Single(x => x.Id == intId); 
      return new ErrorLogEntry(this, id, ErrorXml.DecodeString(item.Details)); 
     } 
    } 

    // etc. 

} 

errorlog jest okablowany w pliku web.config: -

<errorLog type="MyProject.EntityFrameworkErrorLog, MyProject" /> 

I” m już używa programu Ninject w innym miejscu projektu. Chciałbym wstrzyknąć MyContext, aby ErrorLog nie tworzyło własnej zależności, ale nie mam szczęścia znaleźć haka w dokumentacji. Wydaje się, że ELMAH tworzy instancję wewnętrznie ErrorLog, więc jedyną opcją, którą wydaje mi się, jest użycie ServiceLocator wewnątrz mojego niestandardowego ErrorLog, którego chciałbym uniknąć, jeśli to możliwe.

Czy istnieją jakieś lepsze zaczepy dostępne w ELMAH, które mogę użyć do wstrzyknięcia?

Odpowiedz

13

Lokalizacja życzenie/Depdency punkt rozszerzenie zastrzyk w ELMAH jest własnością ServiceCenter.Current gdzie można podać delegata z następującym podpisem:

public delegate IServiceProvider ServiceProviderQueryHandler(object context); 

ELMAH użyje System.IServiceProvider zwrócony przez ServiceCenter.Current rozwiązać ErrorLog isntances .

Więc trzeba zrobić 3 rzeczy do konfiguracji ją Ninject (lub jakimkolwiek pojemniku DI)

  1. Stwórz własną System.IServiceProvider realizację z Ninject interfejs IKernel już wynika z od System.IServiceProvider, tak to się robi.
  2. Musisz zarejestrować swój EntityFrameworkElmahErrorLog w swoim pojemniku jako implementację ErrorLog, ponieważ ELMAH spróbuje rozwiązać wystąpienie ErrorLog.
  3. Podaj delegata do ServiceCenter.Current

Więc trzeba coś jak następuje w sposób RegisterServices:

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ErrorLog>().To<EntityFrameworkElmahErrorLog>(); 
    ServiceCenter.Current = (httpContext) => kernel; 
} 

UWAGA: w delegata ServiceProviderQueryHandler masz aktualną HttpContext i że można zmień sposób rozwiązywania twoich problemów.

Należy również pamiętać, że dzięki temu podejściu utracisz możliwość skonfigurowania swojego w swoim pliku konfiguracyjnym.

ELMAH zawsze użyje rozpoznanej instancji z Twojego kontenera, ponieważ wbudowany plik ServiceContainer odczytuje plik konfiguracyjny, który przesłoniłeś niestandardową logiką.

+0

Idealne, dzięki! –

Powiązane problemy