我的dll中的几个类需要一组数据(一般配置)。这些数据由使用dll 通过实现接口IConfigs 的人提供。所以数据应该作为依赖注入。现在我想知道该怎么做。
更新:
抱歉,如果问题不明确。问题是我应该在每个需要它的类中使用实例 IConfigs并使用构造函数注入(我不喜欢这种方法)或者有更简洁的方法处理这种情况?答案 0 :(得分:1)
您可以按属性使用注入依赖项。
如果您使用MEF:
服务
[Export(typeof(IServiec))]
public class Service : IService
{
....
}
客户
public class Client
{
[Import]
public IService Service
{
}
}
注意:您需要添加行以注册目录和容器
答案 1 :(得分:1)
如果我理解正确,你想要用一个接口注册不同的派生类,不知道你使用什么IoC容器,但在这里我使用Unity作为示例代码,但大多数其他IoC容器支持使用一个用于区分一个界面中的注册的字符串。假设你有:
public interface IConfig {}
public class ConfigA : IConfig {}
public class ConfigB : IConfig {}
因此,您可以使用不同的名称将ConfigA
和ConfigB
注册到IConfig:
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;
}
}
如果您不想使用构造函数依赖项,请使用property:
public class MainA
{
[Dependency("A")]
private IConfig Config { get; set; }
}
答案 2 :(得分:1)
由于你的助手类是静态的,你将无法使用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
的{{1}}设置隐藏的依赖关系。
因此,我建议您将助手类更改为非静态类,并通过其构造函数将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;
}
}
没有自己的状态,你可以配置你的DI容器来管理它的Singleton生命周期,这实际上使它“静态”,没有任何缺点。