如果我理解正确,您想在静态方法中注入ILogger的实例。正如您可能已经发现的那样,当依赖方法是静态时,您无法以“常规方式”使用依赖注入。
您可能正在寻找的是服务定位器模式。
使用StructureMap IoC容器(但您可以真正使用任何容器),用于连接它的配置可能如下所示:
For<ILogger>().Use<SomeLoggerImplementation>();
当实施时,您的调用代码可能如下所示:
public class ValidateDataInAPI
{
private static ILogger Logger
{
get { return DependencyResolver.Resolve<ILogger>(); }
}
public static bool IsValid(string data)
{
If(error)
{
Logger.Error("Log error as implemented by caller");
}
}
}
我想指出这可能被视为反模式,只有在有明确理由时才应使用,而不仅仅是为了方便。
依赖注入的整个思想是将依赖项注入到调用代码的构造函数中,从而向外界公开类的所有依赖关系。
这不仅提高了代码的可读性(没有内部隐藏的“惊喜”),还提高了可测试性。你不想在单元测试项目中配置IoC容器,对吧?正确使用依赖注入可以消除这种必要性,并在想要单元测试代码时使生活变得更轻松。
如果您不熟悉依赖注入的概念,此链接 可以帮助您入门。有很多信息可供参考。
使用依赖注入,您的调用代码将如下所示:
public class ValidateDataInAPI : IValidateDataInAPI
{
private readonly ILogger _logger;
public ValidateDataInAPI(ILogger logger)
{
_logger = logger;
}
public bool IsValid(string data)
{
If(error)
{
_logger.Error("Log error as implemented by caller");
}
}
}
同样地,通过为您的验证类定义一个接口,您可以将该验证类注入到API类中:
public interface IValidateDataInAPI
{
bool IsValid(string data);
}
现在您可以模拟验证器类,这将使您更轻松地对API类进行单元测试。
话虽如此,如果您确实需要保持IsValid方法的静态性,则服务定位器模式可能是正确的选择。