c# - How create a instance of class with dependent in constructor from startup.cs(ASP.NET Core) -
i'm trying create email client in asp.net core web application.i have created class db service dependent , have method inside class connect mail box , starts listening on separate thread.but i'm unable create instance of class startup.cs file because unable pass idbxxxxservice constructor.
var serviceprovider = services.buildserviceprovider(); serviceprovider.createinstance<mailevents>().mailsubscribe(new imapconnection { host = "imap.gmail.com", enableoauth = false, port = 993, enablessl = true, username = "xxxxxxxxxxx", password = "9xxxxxxxxxxxxxx", }); and here extension method have written create instance using reflection.
public static tresult createinstance<tresult>(this iserviceprovider provider) 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) tresult; } return null; }
let's assume class looks like
public class mailevents { public mailevents(idbxxxservice db) { //... } } register other dependencies service collection in composition root.
services.addsingleton<idbxxxservice, dbxxxservice>(); //choose appropriate lifetime services.addsingleton<mailevents>(); that way when asking service service provider have needs hydrate object graph.
var serviceprovider = services.buildserviceprovider(); serviceprovider.getservice<mailevents>().mailsubscribe(new imapconnection { host = "imap.gmail.com", enableoauth = false, port = 993, enablessl = true, username = "xxxxxxxxxxx", password = "9xxxxxxxxxxxxxx", }); you can use 1 of overloaded methods well
//if need manually create dependency have option //in case needed add other customizations. services.addsingleton<idbxxxservice>(provider => new dbxxxservice()); //choose appropriate lifetime
Comments
Post a Comment