i migrating webform (not webform technology, stripped down web application webform functionality) asp.net mvc asp.net core mvc. current biggest problem static class had in previous version of webform. static class uses packages available in .net not in .net core.
i understand of methods in static class, have use dependency injection resolve package problems. however, not possible pass parameter static class making "antipattern" .net core.
my utils.cs static class has 2 methods, renderpartialtostring
, sendemail
. sendemail
simple , has no problems current .net core packages. however, have following code in static class not work current version.
public static class utils { public static readonly string apiurl = configurationmanager.appsettings["apiurl"]; public static readonly string apikey = configurationmanager.appsettings["apikey"]; public static string renderpartialtostring(controller controller, string viewname, object model) { controller.viewdata.model = model; using (stringwriter sw = new stringwriter()) { viewengineresult viewresult = viewengines.engines.findpartialview(controller.controllercontext, viewname); viewcontext viewcontext = new viewcontext(controller.controllercontext, viewresult.view, controller.viewdata, controller.tempdata, sw); viewresult.view.render(viewcontext, sw); return "document.write('" + sw.getstringbuilder().replace('\n', ' ').replace('\r', ' ').replace("'","\\'").tostring() + "');"; } } ... }
viewengine , configurationmanager not available in .net core making static class difficult migrate. believe, implement both of these features dependency injection. however, not know how change static class can use dependency injection , able use these methods in controllers.
how can migrate static class .net core dependency injection implementation? need change instances of utils class , make not static?
you should refactor object non static methods, register object di services can injected controller's constructor or wherever need it.
i have viewrenderer class similar functionality here use generate html email using razor.
i register di this:
services.addscoped<viewrenderer, viewrenderer>();
note viewrenderer has own constructor dependencies similar need in static method:
public viewrenderer( icompositeviewengine viewengine, itempdataprovider tempdataprovider, iactioncontextaccessor actionaccessor ) { this.viewengine = viewengine; this.tempdataprovider = tempdataprovider; this.actionaccessor = actionaccessor; } private icompositeviewengine viewengine; private itempdataprovider tempdataprovider; private iactioncontextaccessor actionaccessor;
viewrenderer's constructor dependencies passed dependency injection, whole idea away static stuff , let provided di.
if need instance of viewrenderer in controller can add constructor signature of controller. don't use directly in controller since use email, instead have emailservice depends on viewrenderer , controller depends on emailservice
so want dependency injection way down dependencies, easy if refactor away static methods object instance methods
Comments
Post a Comment