Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Microsoft';什么是依赖注入?_C#_.net - Fatal编程技术网

C# 使用Microsoft';什么是依赖注入?

C# 使用Microsoft';什么是依赖注入?,c#,.net,C#,.net,我是自学成才的程序员,所以我觉得这有点难。我试图动态创建一个logger类,让我解释一下。每个类都有一个ILogger实例,它实际上就是ConsoleLogger public class ConsoleLogger : ILogger { public ConsoleLogger(Type classType) { } } 以下是我目前的做法 this.AddSingleton<ILogger, ConsoleLogger>(provider =>

我是自学成才的程序员,所以我觉得这有点难。我试图动态创建一个logger类,让我解释一下。每个类都有一个ILogger实例,它实际上就是ConsoleLogger

public class ConsoleLogger : ILogger
{
    public ConsoleLogger(Type classType)
    {
    }
}
以下是我目前的做法

this.AddSingleton<ILogger, ConsoleLogger>(provider =>
    new ConsoleLogger(typeof(Program)) // TODO: make this dynamic
);
this.AddSingleton(提供程序=>
新建ConsoleLogger(typeof(Program))//TODO:使其动态
);

所以我在做课程计划的地方,需要把它注入到课程中。另外,请注意ILogger不是Microsofts logger,它是我自己创建的ILogger界面,因此
.AddLogging
无法工作。

您可以进行程序集扫描。只需获取当前正在执行的程序集或您想要的程序集,并使用LINQ向下过滤那些实现ILogger的人。如果它们有依赖关系,那么您可能希望使用像Autofac这样的DI框架。我可能在这里遗漏了
Program
的部分/角色。您能告诉我们为什么控制台记录器需要类型程序吗?通常,您在应用程序的
Main()
中设置所有内容。对于日志记录,我们实际上使用了一个简单的单例,它将日志记录代理给我们想要的iLogger。感谢您的评论。我不想改变我的DI框架,而且我听说反射会很耗时,因为每个类都创建了一个新实例,不是吗?我不认为这是最好的方法。@DennisKuypers它需要记录器所属的任何一个类,它用于记录记录消息的类,如果记录的是错误,那么由于明显的原因,它会大有帮助。我们有一个单例(我们有静态方法)
LogManager
,它提供了一个
GetLogger(键入myType)
返回ILogger实例。此实例是一个代理,其中包含创建它的
类型
。我们将所有日志信息传递给实际的日志记录器,然后日志记录器将其传递给所有注册的
ILogOutput
实例。此外,我们还进行一些过滤(日志的级别和来源)。也许你可以从Log4Net这样的开源项目中获得灵感。你的控制台记录器应该是我系统中的
ILogOutput