我的 dll 中的几个类需要一组数据(一般配置)。这些数据由使用 dll 的人通过实现接口 IConfigs 提供。所以数据应该作为依赖注入。现在我想知道该怎么做。
更新 :
抱歉,如果问题不清楚。问题是我应该在每个需要它的类中都有一个 IConfigs实例并使用构造函数注入(我不喜欢这种方法)还是有一种更清洁的方法来处理这种情况?
我的 dll 中的几个类需要一组数据(一般配置)。这些数据由使用 dll 的人通过实现接口 IConfigs 提供。所以数据应该作为依赖注入。现在我想知道该怎么做。
更新 :
抱歉,如果问题不清楚。问题是我应该在每个需要它的类中都有一个 IConfigs实例并使用构造函数注入(我不喜欢这种方法)还是有一种更清洁的方法来处理这种情况?
您可以按属性使用注入依赖项。
如果您使用 MEF :
服务
[Export(typeof(IServiec))]
public class Service : IService
{
....
}
客户
public class Client
{
[Import]
public IService Service
{
}
}
注意:您添加行以注册您的目录和容器
如果我理解正确,你想用一个接口注册不同的派生类,不知道你使用什么 IoC 容器,但在这里我使用 Unity 作为示例代码,但大多数其他 IoC 容器支持使用一个字符串来区分在一个界面中注册。假设你有:
public interface IConfig {}
public class ConfigA : IConfig {}
public class ConfigB : IConfig {}
因此,您可以使用不同的名称注册 IConfigConfigA
和IConfig:ConfigB
var container = new UnityContainer();
container.RegisterType<IConfig, ConfigA>("A");
container.RegisterType<IConfig, ConfigA>("B");
public class MainClass
{
private IConfig _config;
public MainClass([Dependency("A")] IConfig config)
{
_config = config;
}
}
如果您不想使用构造函数依赖项,请使用属性:
public class MainA
{
[Dependency("A")]
private IConfig Config { get; set; }
}
由于您的助手类是静态的,因此您将无法使用 DI,除非您使用ServiceLocator
样式并让您的助手类自己检索注入的值,如下所示:
public static class HelperClass
{
static HelperClass()
{
var config = ServiceLocator.Get<IConfig>();
UserId = config.Get("UserId");
}
public static int UserId { get; private set; }
}
ServiceLocator
这不被认为是好的做法,因为您的助手类对您的设置具有隐藏的依赖关系,IConfig
其中包含UserId
.
因此,我建议您将辅助类更改为非静态的,并IConfig
通过其构造函数将其注入其中,如下所示:
public class HelperClass
{
public HelperClass(IConfig config)
{
UserId = config.Get("UserId");
}
public int UserId { get; private set; }
}
然后,您可以通过它们的构造函数将您的注入HelperClass
到您的服务类中,如下所示:
public class ServiceClass
{
private readonly HelperClass _helperClass;
public ServiceClass(HelperClass helperClass)
{
_helperClass = helperClass;
}
}
这样,每个组件都可以根据需要进行交换、存根或模拟。如果您HelperClass
没有自己的状态,您可以配置您的 DI 容器以使用 Singleton 生命周期对其进行管理,这基本上使其成为“静态”而没有任何缺点。