我有一个用于记录异常的界面,即IExceptionLogger
。
此界面有3个实现:DBExceptionLogger
,XMLExceptionLogger
,CSVExceptionLogger
。
我有一个可以使用DBExceptionLogger
的应用程序。
该应用程序仅引用IExceptionLogger
。如何在应用程序中创建DBExceptionLogger
的实例。
我无法直接引用DBExceptionLogger
,因为它会破坏IExceptionLogger
接口的目的。
答案 0 :(得分:7)
您应该查看inversion of control和dependency injection的概念。这些将帮助您注入实现您的接口的对象的特定实例,您的代码需要知道超出该事实的确切内容。 .NET中有许多可以帮助您的库:Unity,Spring.NET,Autofac,LinFu,仅举几例。
答案 1 :(得分:3)
您可以使用Factory模式(一个负责创建IExceptionLogger
类的类),或者更一般地说,使用Inversion of Control框架。
答案 2 :(得分:3)
//Usage of logger with factory
IExceptionLogger logger = ExceptionLoggerFactory.GetLogger();
public static class ExceptionLoggerFactory
{
public static IExceptionLogger GetLogger()
{
//logic to choose between the different exception loggers
//e.g.
if (someCondition)
return new DBExceptionLogger();
//else etc etc
}
}
答案 3 :(得分:2)
IExceptionLogger logger = new DBExceptionLogger();
然后将 logger 变量传递给所有写日志信息的类。
答案 4 :(得分:1)
你可以使用像这样的静态工厂使用穷人的DI:
public class ExceptionLoggerFactory
{
public static IExceptionLogger GetDBLogger()
{
return new DBExceptionLogger();
}
}
public class MyClass
{
private IExceptionLogger _logger;
public MyClass() : this(ExceptionLoggerFactory.GetDBLogger())
{
}
public MyClass(IExceptionLogger logger)
{
_logger = logger;
}
}