2017-07-26 5 views
2

Ich versuche, E-Mail-Client in meiner asp.net Kern-Webanwendung zu erstellen.Ich habe eine Klasse mit einigen DB-Dienst als erstellt abhängig und ich habe eine Methode innerhalb dieser Klasse, die eine Verbindung zur Mailbox herstellt und sie in einem separaten Thread abgehört. Aber ich kann keine Instanz der Klasse aus der Datei startup.cs erstellen, weil ich IDBxxxxService nicht übergeben kann der Konstruktor.Wie erstelle ich eine Instanz der Klasse mit abhängigen im Konstruktor von Startup.cs (ASP.NET Core)

var serviceProvider = Services.BuildServiceProvider(); 
     serviceProvider.CreateInstance<MailEvents>().MailSubscribe(new IMAPConnection 
     { 
      Host = "imap.gmail.com", 
      EnableOAuth = false, 
      Port = 993, 
      EnableSSL = true, 
      UserName = "xxxxxxxxxxx", 
      Password = "9xxxxxxxxxxxxxx", 
     }); 

und hier ist Erweiterungsmethode i geschrieben haben die Instanz mithilfe von Reflektion zu erstellen.

public static TResult CreateInstance<TResult>(this IServiceProvider provider) where TResult: class 
    { 
     ConstructorInfo constructor = typeof(TResult).GetConstructors()[0]; 

     if (constructor != null) 
     { 
      object[] args = constructor 
       .GetParameters() 
       .Select(o => o.ParameterType) 
       .Select(o => provider.GetService(o)) 
       .ToArray(); 

      return Activator.CreateInstance(typeof(TResult), args) as TResult; 
     } 

     return null; 
    } 
+0

registrieren alle anderen Abhängigkeiten mit dem Service-Sammlung. Wenn Sie nach Ihrem Service fragen, wird der Container alles enthalten, was Sie benötigen, um das Objektdiagramm zu hydratisieren. – Nkosi

Antwort

2

Lassen Sie uns Ihre Klasse annehmen sieht ungefähr so ​​

public class MailEvents { 
    public MailEvents(IDbxxxService db) { 
     //... 
    } 
} 

registrieren alle anderen Abhängigkeiten mit dem Service Sammlung in der Zusammensetzung Wurzel.

Services.AddSingleton<IDbxxxService, DbxxxService>(); //Choose appropriate lifetime 
Services.AddSingleton<MailEvents>(); 

Auf diese Weise, wenn Sie Ihren Service den Service-Provider gefragt werden alle Objektgraphen Hydrat es haben muss.

var serviceProvider = Services.BuildServiceProvider(); 
serviceProvider.GetService<MailEvents>().MailSubscribe(new IMAPConnection 
{ 
    Host = "imap.gmail.com", 
    EnableOAuth = false, 
    Port = 993, 
    EnableSSL = true, 
    UserName = "xxxxxxxxxxx", 
    Password = "9xxxxxxxxxxxxxx", 
}); 

Sie auch eine der überladenen Methoden können auch

//if you need to manually create dependency you have that option as well 
//in case you needed to add other customizations. 
Services.AddSingleton<IDbxxxService>(provider => new DbxxxService()); //Choose appropriate lifetime 
+0

Aber in meinem Fall hat DbxxxService nur noch wenige Abhängige. Beispiel: DbxxxService (IUnitOfWork unitOfWork, ILoggerFactory loggerFactory, IMapper mapper) – tech2avinash

+0

Sie müssten auch registriert werden oder die Überladung verwenden und sie selbst erstellen, wenn Sie Ihren Dienst registrieren. Der Dienstleister muss sich dessen bewusst sein, was er schaffen kann. – Nkosi

Verwandte Themen