2017-07-26 52 views
2

我正尝试在我的asp.net核心Web应用程序中创建电子邮件客户端。我创建了一些具有某些数据库服务的类,如依赖和我有一个方法在这个类,将连接到邮箱,并开始在一个单独的线程监听它。但我无法从startup.cs文件创建类的实例,因为我无法通过IDBxxxxService到构造函数。如何在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", 
     }); 

这里是我写的使用反射创建实例的扩展方法。

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

注册的所有其他依赖的服务集合。这样,当询问您的服务时,容器将具备保存对象图所需的全部内容。 – Nkosi

回答

2

让我们假设你的类看起来像

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

注册的所有其他依赖与组合物根的服务集合。

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

这样,当询问您的服务时,服务提供商将拥有所有需要的水合对象图。

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

您还可以使用的重载方法之一,也是

//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

但在我的情况下,DbxxxService有更多的依赖。例如DbxxxService(IUnitOfWork unitOfWork,ILoggerFactory loggerFactory,IMapper映射器) – tech2avinash

+0

它们也需要注册,或者在注册服务时使用重载并创建它们。服务提供商需要了解它可以创建的所有内容。 – Nkosi

相关问题