我在 ASP.NET Boilerplate MVC 项目的 Web 项目中实现类中的日志记录时遇到问题。日志记录在 Web 项目和应用程序项目中的控制器中按预期工作,但在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
手动注册类,但我收到一个不同的错误,说它不满足 string 的依赖关系sessionID
。
要Logger
在构造函数中使用,请注入RecordManager
和构造函数注入ILogger
。
亲:干净。
缺点: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");
}
}
替代方案:注入IIocResolver
、解析RecordManager
和构造函数注入ILogger
。
优点:范围类似于new
.
缺点:冗长。
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");
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句