Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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# 如何与Unity一起使用Serilog?_C#_Asp.net Mvc_Dependency Injection_Unity Container_Serilog - Fatal编程技术网

C# 如何与Unity一起使用Serilog?

C# 如何与Unity一起使用Serilog?,c#,asp.net-mvc,dependency-injection,unity-container,serilog,C#,Asp.net Mvc,Dependency Injection,Unity Container,Serilog,最近我发现了serilog(针对.net的结构化日志记录),并看到了它的许多优点。但我面临着一些问题。 我有4个项目,一个是web,一个是基础设施,另外两个是windows服务,我想声明serilog配置一次并多次使用它。 我还想将它与依赖项注入一起使用。 我已经在网上搜索了三天了,但我没有发现任何有用的东西,请有人帮我 例如,我希望这个类成为我的日志类 public interface IMyLogger { void Information(string message, objec

最近我发现了serilog(针对.net的结构化日志记录),并看到了它的许多优点。但我面临着一些问题。 我有4个项目,一个是web,一个是基础设施,另外两个是windows服务,我想声明serilog配置一次并多次使用它。 我还想将它与依赖项注入一起使用。 我已经在网上搜索了三天了,但我没有发现任何有用的东西,请有人帮我

例如,我希望这个类成为我的日志类

public interface IMyLogger
{
    void Information(string message, object[] parameters);
}

public class MyLogger : IMyLogger
{
    public MyLogger()
    {
    }
    public void Information(string message, object[] parameters)
    {
        Log.Information("LogType : {LogType} - Operation : {Operation}", parameters);
    }
}
public class UserClass
{
private readonly IMyLogger _myLogger;
public UserClass(IMyLogger myLogger)
        {
            _myLogger = myLogger;
        }
}
现在我不知道应该把这行代码放在哪里:

Log.Logger = new LoggerConfiguration()
            .WriteTo.Console()
            .CreateLogger();

Tnx。首先,在Unity配置中,要正确解析Serilog,需要使用InjectionFactory,如下所示:

        container.RegisterType<ILogger>(new ContainerControlledLifetimeManager(), new InjectionFactory((ctr, type, name) =>
        {
            ILogger log = new LoggerConfiguration()
                .WriteTo.Console() //Your serilog config here
                .CreateLogger();

            return log;
        }));   
    /// <summary>Integrates Unity when the application starts.</summary>
    public static void Start() 
    {
        //This is the important part:
        var container = UnityConfig.GetConfiguredContainer(); //This is a static class in the InversionOfControl project.

        //This is generic:
        FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
        FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }

container.RegisterType(新ContainerControlledLifetimeManager(),新注入工厂((ctr,类型,名称)=>
{
ILogger日志=新日志配置()
.WriteTo.Console()//此处是您的serilog配置
.CreateLogger();
返回日志;
}));   
在我的实现中,我没有抽象Serilog,但是上面的代码在任何情况下都是缺少的链接。IMyLogger只需要参数注入ILogger,一切都会自行解决

这就解决了MVC部分:您可以在MVC中向控制器中注入IMyLogger

这就让我们知道在您的解决方案中应该在哪里找到它。由于您对服务的需求,您可能需要一个单独的包含绑定的反转控制项目(MySolution.InversionOfControl)。然后,例如,在网站的UnityWebActivator.cs中,可以执行以下操作:

        container.RegisterType<ILogger>(new ContainerControlledLifetimeManager(), new InjectionFactory((ctr, type, name) =>
        {
            ILogger log = new LoggerConfiguration()
                .WriteTo.Console() //Your serilog config here
                .CreateLogger();

            return log;
        }));   
    /// <summary>Integrates Unity when the application starts.</summary>
    public static void Start() 
    {
        //This is the important part:
        var container = UnityConfig.GetConfiguredContainer(); //This is a static class in the InversionOfControl project.

        //This is generic:
        FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
        FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }
///在应用程序启动时集成Unity。
公共静态void Start()
{
//这是重要的部分:
var container=UnityConfig.GetConfiguredContainer();//这是InversionOfControl项目中的一个静态类。
//这是通用的:
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType().First());
FilterProviders.Providers.Add(新UnityFilterAttributeFilterProvider(容器));
SetResolver(新UnitedDependencyResolver(容器));
}

为您的服务做同样的事情,您应该很乐意去做

这很有效。但是我注意到,Unity 4.0.1中没有指定的默认生存期管理器是瞬态生存期管理器。这意味着每个解析ILogger的调用都将执行注入工厂并返回一个新实例。我认为日志记录器应该使用ContainerController LifeTimeManager来代替?@dotnetguy迟做总比不做好,我现在正在更新它。:)对于其他所有人来说:ContainerController LifeTimeManager在模仿Serilog的单例行为方面做得最好。其他生命周期管理器也可以工作,但这可能比为每个请求创建一个新的Serilog实例略为有效。ContainerControlled生命周期管理器和HierarchyCallifeTimeManager是唯一调用dispose方法的。因此,使用任何其他工具都可能会影响日志的刷新。像@BrianMacKay一样,我也认为容器控制对SeriLog更好。如何通过工厂配置记录器(如最低级别)?这里有一个奇怪的第22条军规。我使用命令行参数来确定是否启用了调试日志记录。但是,处理命令行参数是在设置组合根之后进行的。但是我需要这个输入参数来配置
LoggerConfiguration
以使用最低级别的调试或信息