Csharp/C#教程:使用静态记录器,静态助手类进行dependency injection分享


使用静态记录器,静态助手类进行dependency injection

我有一个静态类,它调用静态Logger类,

例如

static class DoesStuffStatic { public static void DoStuff() { try { //something } catch(Exception e) { //do stuff; Logger.Log(e); } } } static class Logger { public static void Log(Exception e) { //do stuff here } } 

如何将Logger注入我的静态类?

注意:我已经通过示例阅读了.NET中的dependency injection? ,但这似乎使用实例记录器。

您无法注入静态记录器。 您必须将其更改为实例记录器(如果可以),或将其包装在实例记录器中(将调用静态)。 同样很难向静态类注入任何东西(因为你不以任何方式控制静态构造函数) – 这就是为什么我倾向于将我想要注入的所有对象作为参数传递。

这不一定是这样。 只要您的静态记录器公开以下方法:

这是一个例子。 DI的课程如下:

  public class Logger : ILogger { public void Log(string stringToLog) { Console.WriteLine(stringToLog); } } public interface ILogger { void Log(string stringToLog); } 

这是我们需要记录器的静态类:

 public static class SomeStaticClass { private static IKernel _diContainer; private static ILogger _logger; public static void Init(IKernel dIcontainer) { _diContainer = dIcontainer; _logger = _diContainer.Get(); } public static void Log(string stringToLog) { _logger.Log(stringToLog); } } 

现在,在您的应用程序的全局启动中(在本例中,在我的global.asax.cs中),您可以实例化您的DI容器,然后将其交给您的静态类。

 public class Global : Ninject.Web.NinjectHttpApplication { protected override IKernel CreateKernel() { return Container; } static IKernel Container { get { var standardKernel = new StandardKernel(); standardKernel.Bind().To(); return standardKernel; } } void Application_Start(object sender, EventArgs e) { SomeStaticClass.Init(Container); SomeStaticClass.Log("Dependency Injection with Statics is totally possible"); } 

并且presto! 您现在已经在静态类中使用DI了。

希望能帮助别人。 我正在重新使用一个使用大量静态类的应用程序,我们已经成功使用了一段时间了。

这是“注入”静态记录器function的一种非常简单的方法。

 public static class Logger { private static Action _logError; public static bool Initialised; public static void InitLogger(Action logError) { if(logError == null) return; _logError = logError Initialised = true; } public static void LogError(string msg, Exception e = null) { if (_logError != null) { try { _logError.Invoke(msg, e); } catch (Exception){} } else { Debug.WriteLine($"LogError() Msg: {msg} Exception: {e}"); } } } public class MainViewModel { public MainViewModel() { //Inject the logger so we can call it globally from anywhere in the project Logger.InitLogger(LogError); } public void LogError(string msg, Exception e = null) { //Implementation of logger } } 

我不确定Logger是如何工作的,但通常你可以使用RequestService来获取你的实例。 例如在抽象类中:

 this.HttpContext.RequestServices.GetService(typeof(YOUR_SERVICE)); 

控制器是可能的,您可以在其中访问HttpContext。

第二种方法是在Startup中使用它,您可以在其中执行此操作:

 serviceCollection.AddScoped(typeof(ICmsDataContext), typeof(TDbContext)); 

其中serviceCollection是dotnet Core中的IServiceCollection

希望它有所帮助。

上述就是C#学习教程:使用静态记录器,静态助手类进行dependency injection分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/959759.html

(0)
上一篇 2021年11月24日
下一篇 2021年11月24日

精彩推荐