我正在构建一个包含各种帮助方法和常用功能的类项目(单独的dll),可以通过一系列不同的应用程序访问 - ASP.NET网站,Web服务和Windows服务。
这个中立类是否有任何方法可以确定调用它的应用程序的类型(例如,它可以选择如何记录信息)?
班级还有哪些“元”信息可供应用程序调用它?
答案 0 :(得分:9)
一个班级应该不知道如何使用它。记住它是一个黑盒子。
如果要将日志记录公开给类,请创建一个日志记录接口,该接口将在构造函数或方法中传递给类。
然后,每个调用应用程序都可以实现自己的记录器版本,并且日志记录实现可以具有您要查找的详细信息。并且该类仅将接口用于LogMessage,LogError等。 。
答案 1 :(得分:5)
您可以通过查看堆栈跟踪获取信息:
StackTrace stackTrace = new StackTrace(); // Get call stack
StackFrame[] stackFrames = stackTrace.GetFrames(); // Get method calls (frames)
string methodName = stackFrames[0].GetMethod().Name; // Get method name
string type = stackFrames[0].GetType().ToString(); // Get the calling type
但是,我认为更好的解决方案是使用更面向对象的方法。创建实现相同接口的不同记录器。根据创建和使用类的内容,将记录器的实例传递给类。
public interface ILogger
{
void Log(string message);
}
public class MyWorkerClass
{
private ILogger m_Logger;
public MyWorkerClass(ILogger logger)
{
m_Logger = logger;
}
public void Work()
{
m_Logger.Log("working")
}
// add other members...
}
public class MyService
{
public void DoSomething()
{
ILogger logger = new MyServiceLogger();
MyWorkerClass worker = new MyWorkerClass(logger);
worker.Work();
}
}
答案 2 :(得分:0)
如果使用日志框架(如NLog或Log4Net),则在客户端应用程序中配置日志记录的方式。在您的共享库中,您只需使用记录器,而无需考虑日志条目的保存方式(文件,事件日志,邮件等)。
答案 3 :(得分:0)
虽然到目前为止我完全同意这里的答案,但您可以获得有关已加载模块的反射信息,将其与堆栈跟踪相结合,您可以找出调用代码的函数和类并获取反射信息这一点。
但是,重申一下,我同意其他帖子,你应该通过一个接口来抽象,因为这使得其他程序员清楚如何使用数据,并减少因错过而引入错误的可能性 - 理解。 (恕我直言,反射应该只用于直接由属性控制的序列化和显式操作,例如.Net中的GUI编辑器)
答案 4 :(得分:0)
你的设计。这有点不对劲。
使用dependency injection将这些“如果它的X做Y,如果它做A做B”选择。那些在不同上下文中发生变化的行为应该封装到实现公共接口的对象中。调用者将确定他希望您使用的接口的实现,并在调用方法之前将注入到您的实例中。