基于配置的依赖注入?

时间:2014-08-25 03:27:59

标签: c# active-directory asp.net-mvc-5

我正在使用active directory来检索用户的应用。有时我需要处理应用程序,但AD无法使用。我使用包装类来检索AD用户。我想根据配置注入不同的类。我正在考虑使用appSetting来告诉我当前的配置并确定注入时使用的类型。是否可以在不使用Web.config转换的情况下获取当前配置?是否可以使用基于Web.config转换的Unity注入对象?你能推荐一种更好的方法吗?

[UPDATE]

我有一个用户存储库类,用于从AD加载用户。我只需要能够更改此存储库类的实现,以便在AD不可用时,我可以以不同的方式加载用户。这只会用于开发,生产将始终访问AD并检索用户。

3 个答案:

答案 0 :(得分:2)

您可以使用预处理程序指令:

#if DEBUG
// register fake repository
#else
// register AD repository
#endif

答案 1 :(得分:0)

嗯,依赖注入非常强大,敏捷,并产生了一种关注点分离。您的方法中的缺陷将来自验证。你看,通过这种方法,你必须选择一个具体的实现。

那你怎么称呼那两个班?

public class LogToText : ILogger
{
     public void LogMessage(string message) { }
}

public class LogToEvent : ILogger
{
     public void LogMessage(string message) { }
}

您有这两种实现方式,但是当您将接口传递给:

public class AD
{
     public AD(ILogger logger) { }
}

所以问题是你认为你可以正确验证以有效地选择正确的实现。否则,依赖注入可能无法正常工作。我们并不完全了解其用途或目标,因此我们的建议可能并不真正有益。希望你明白我的意思,因为你必须看看你是否无法测试特定的方式。

答案 2 :(得分:0)

您可以使用抽象:

public interface IPersonService
{
    IEnumerable<Person> Find(PersonSearchParameters searchParams);
    Person GetByAccountName(string accountName);
    [ETC...]
}

然后你的AD和开发都实现了这个界面。

为了简化操作,我建议使用StructureMap IoC,这样您就可以轻松完成:

x.For<IPersonService>.Use<ActiveDirectoryPersonService>(); //for production

x.For<IPersonService>.Use<MockPersonService>(); //for development

使用此功能时,您可以为instancce:

public class TestController : Controller
{
    IPersonService _service;

    public TestController(IPersonService service)
    {
        _service = service;
    }
}

在这种情况下,我不建议使用XML文件进行配置,而是建议使用结构图的Fluent代码,在重构时更好,并避免因编译而导致错误输入。

StructureMap: http://structuremap.net

通过NuGET轻松安装