0

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

更新 :

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

4

3 回答 3

1

您可以按属性使用注入依赖项。

如果您使用 MEF :

服务

[Export(typeof(IServiec))]
public class Service : IService
{
 ....

}

客户

public  class Client  
{
    [Import]
    public IService Service
    {

    }
}

注意:您添加行以注册您的目录和容器

于 2012-09-26T09:22:13.540 回答
1

如果我理解正确,你想用一个接口注册不同的派生类,不知道你使用什么 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; }
}
于 2012-09-26T10:27:49.133 回答
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其中包含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 生命周期对其进行管理,这基本上使其成为“静态”而没有任何缺点。

于 2012-09-26T11:40:21.930 回答