2016-04-21 7 views
2

Ich habe eine ILogger Schnittstelle und eine ILogger<T> welche die tatsächlich implementiert ist und erbt von der ehemaligen. Ich habe die ILogger<T> Schnittstelle in Autofac registriert und es funktioniert gut, aber ich muss um eine ILogger<T> bitten. Ist es möglich zu machen, so dass, wenn:Injektion eines Dienstes generisch in der Klasse, die es in MVC injiziert wird 5

class MyService 
{ 
    public MyService(ILogger logger)... 
} 

logger tatsächlich ILogger<MyService>

+0

Sie tun 'öffentlichen MyService (ILogger Logger)'. Aber das scheint zu sein, als hättest du eine seltsame Logging-Klasse. –

+0

Kannst du es nicht auch für 'ILogger' registrieren? Ich bezweifle, Autofac wird automatisch Ihre 'ILogger ' Registrierung verwenden, nur weil es diese Schnittstelle erweitert. –

+0

'builder.RegisterGeneric (typeof (SomeInstance1 <>)) .As (typeof (IGenericInterface <>))' –

Antwort

0
ist

So Registrierung zuerst: vom docs

builder.RegisterGeneric(typeof(NHibernateRepository<>)) 
    .As(typeof(IRepository<>)) 
    .InstancePerLifetimeScope(); 

So Ihr Code

builder.RegisterGeneric(typeof(LoggerService<>)) 
    .As(typeof(ILogger<>)) 
    .InstancePerLifetimeScope(); 

Hier ist mein Arbeitsprobe:

using System; 
using Autofac;   

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Hello World"); 

     var builder = new ContainerBuilder(); 

     builder.RegisterGeneric(typeof(LoggerService<>)) 
       .As(typeof(ILogger<>)) 
       .InstancePerLifetimeScope(); 

     var container = builder.Build(); 

     var obj = container.Resolve<ILogger<MyService>>(); 
     var obj2 = container.Resolve<ILogger<OtherService>>(); 

     Console.WriteLine(obj.Log()); 
     Console.WriteLine(obj2.Log()); 
    } 
} 

public interface ILogger<T> 
{ 
    string Log(); 
} 

public class LoggerService<T> : ILogger<T> 
{ 
    public string Log() 
    { 
     return typeof(T).Name; 
    } 
} 

public class MyService 
{ 

} 

public class OtherService 
{ 

} 

Ausgänge:

Hallo Welt

MyService

OtherService

+0

Ich habe bereits das arbeiten, was ich will, ist in der Lage zu tun 'container.Resolve ();' und Holen Sie sich den richtigen 'ILogger ', wo 'T' ist die Klasse namens' Resolve'. – Luiso

+0

Es ist keine Abhängigkeitsinjektion, wenn Sie Resolve aufrufen ..... in Ihrem Konstruktor würden Sie einfach 'public MyService (ILogger myServiceLogger)' aber wieder scheint es komisch, dass Sie ein Cross-Cutting-Anliegen an einen Dienst binden. Es scheint ein bisschen komisch ... –

+0

Wenn Sie meine Frage sehen, was ich tun möchte, ist öffentliche MyService (ILogger Logger) 'und haben' Logger' tatsächlich 'ILogger '. – Luiso