Вход в класс с помощью встроенного регистратора - PullRequest
0 голосов
/ 01 июня 2018

У меня проблемы с реализацией ведения журнала в классе в веб-проекте в проекте ASP.NET Boilerplate MVC.Ведение журнала работает должным образом в контроллере в веб-проекте и в проекте приложения, но не в классе RecordManager.Он не выдает никаких ошибок и ничего не регистрирует в классе RecordManager.

public class MainController : Controller
{
    public Castle.Core.Logging.ILogger Logger { get; set; }

    public ActionResult Index(string SessionID)
    {
        Logger.Info("MainController - inside Index");
        var recordMgr = new RecordManager(SessionID);
        recordMgr.PushRecords();
    }
}

public class RecordManager
{
    public ILogger Logger { get; set; }
    private string _sessionID = string.Empty;

    public RecordManager(string sessionID)
    {
        _sessionID = sessionID;
        Logger = NullLogger.Instance;
        Logger.Info("RecordManager - inside constructor");
    }

    public void PushRecords()
    {
        Logger.Info("RecordManager - PushRecords - start");
    }
}

Пытался зарегистрировать класс RecordManager вручную, но я получаю другую ошибку, говоря, что он не удовлетворяетзависимость для строки sessionID.

1 Ответ

0 голосов
/ 01 июня 2018

Чтобы использовать Logger в конструкторе, введите RecordManager и введите-конструктор ILogger.

Pro: Clean.
Con: SessionID имеет открытый установщик.

public class MainController : Controller
{
    public ILogger Logger { get; set; }
    public RecordManager _recordMgr { get; set; } // Add

    public ActionResult Index(string SessionID)
    {
        Logger.Info("MainController - inside Index");
        _recordMgr.SessionID = SessionID; // Modify
        _recordMgr.PushRecords(); // Modify
    }
}

public class RecordManager : ITransientDependency // Modify
{
    public ILogger Logger { get; set; }
    public string SessionID { get; set; } = string.Empty; // Modify

    public RecordManager(ILogger logger) // Modify
    {
        // _sessionID = sessionID; // Remove
        Logger = logger; // Modify
        Logger.Info("RecordManager - inside constructor");
    }

    public void PushRecords()
    {
        Logger.Info("RecordManager - PushRecords - start");
    }
}

Альтернатива: Inject IIocResolver, resol RecordManager и constructor-inject ILogger.

Pro: область действия, аналогичная new.
Con: Verbose.

public class MainController : Controller
{
    public ILogger Logger { get; set; }
    public IIocResolver IocResolver { get; set; } // Add

    public ActionResult Index(string SessionID)
    {
        Logger.Info("MainController - inside Index");
        using (var wrapper = IocResolver.ResolveAsDisposable<RecordManager>(new { sessionID = SessionID })) // Modify
        {
            var recordMgr = wrapper.Object; // Add
            recordMgr.PushRecords();
        }
    }
}

public class RecordManager : ITransientDependency // Modify
{
    public ILogger Logger { get; set; }
    private string _sessionID = string.Empty;

    public RecordManager(string sessionID, ILogger logger) // Modify
    {
        _sessionID = sessionID;
        Logger = logger; // Modify
        Logger.Info("RecordManager - inside constructor");
    }

    public void PushRecords()
    {
        Logger.Info("RecordManager - PushRecords - start");
    }
}
...