将有关客户端的信息传递给依赖项

时间:2017-02-08 14:40:04

标签: c# dependency-injection autofac autofac-configuration

假设我有一个可能被我的应用程序中的每个类使用的实用程序(例如记录器)。我希望记录器能够保存有关使用记录器的客户端类型的信息,即如果StockProvider想要记录消息,记录器应该附加StockProvider类名和日志消息。并且StockProvider通过构造函数传递记录器,如

public StockProvider (ILogger logger) {}

所以它可以在其方法中使用记录器。 我知道每次使用记录器时都会传递类型信息,例如logger.Log (GetType(), msg)。我想要的是记录器在其状态下具有该客户端类型信息,而不是必须将该类型信息传递给记录器方法,以便调用Log导致消息被附加类型名称。例如。使用像

这样的构造函数传递它
class Logger : ILogger {
    public Logger (Type clientType) {
        this.type = clientType;
    }
    public void Log(string msg)
    { Console.WriteLine(this.type.FullName + msg); }
}

将在StockProvider内部工作,我可以说

logger.Log (msg)

所以问题是:我能够以这样一种通用的方式注册Logger,它接收请求记录器的clientType客户端是StockProvider还是其他任何其他客户类型? 请注意,我使用记录器只是一些可能在代码中广泛使用的类的示例。它也可能是一种想要知道谁触发事件的事件发布者

2 个答案:

答案 0 :(得分:2)

您可以创建一个通用记录器,如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <View
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="@drawable/line">
    </View>

    <View
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="@drawable/line">
    </View>
</LinearLayout>

现在您必须在DI容器中注册 public interface ILogger<T> where T: class { void Log(string message, LogLevel level); } public class Logger<T> : ILogger<T> where T: class { public void Log(string message, LogLevel level) { WriteLog(typeof(T).Name + ": " + message, level); } } 的通用实现,例如在ILogger中您可以执行此操作:

UnityContainer

接下来,您的提供商必须如下:

    IUnituContainer container = new UnityContainer()'
    container.RegisterType(typeof(ILogger<>), typeof(Logger<>));

答案 1 :(得分:0)

使用log4Net,你可以这样做:

public class Import 
{
    private static ILog Log
    {
        get
        {
            if (LogManager.GetCurrentLoggers().Length == 0)
            {
                // load logger config with XmlConfigurator
                log4net.Config.XmlConfigurator.Configure();
            }
            return LogManager.GetLogger(typeof(Import));
        }
    }

在我的案例中,Import是我班级的名称,因为很明显。您需要根据需要更改此代码。