如何使用依赖注入来提供几个类所需的数据

时间:2012-09-26 09:14:43

标签: c# asp.net dependency-injection

我的dll中的几个类需要一组数据(一般配置)。这些数据由使用dll 通过实现接口IConfigs 的人提供。所以数据应该作为依赖注入。现在我想知道该怎么做。

更新:

抱歉,如果问题不明确。问题是我应该在每个需要它的类中使用实例 IConfigs并使用构造函数注入(我不喜欢这种方法)或者有更简洁的方法处理这种情况?

3 个答案:

答案 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 {}

因此,您可以使用不同的名称将ConfigAConfigB注册到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生命周期,这实际上使它“静态”,没有任何缺点。