【问题标题】:IOC on IValidationDictionary with Castle WindsorIOC on IValidationDictionary 与温莎城堡
【发布时间】:2010-10-05 14:35:54
【问题描述】:

我是温莎城堡的新手,我只是在使用最新版本。我已经为我的存储库创建了运行良好的条目,但我有一个最终依赖项,我将其传递到我的控制器中。

我创建了一个继承自 IValidationDictionary 的 ModelStateWrapper。 ModelStateWrapper 在其构造函数中采用 ModelStateDictionary,因此在我的代码中,我可以将以下内容作为示例传递:

IMembershipService _memSvc;
IValidationDictionary _validationService;

public AccountController()
{
    _validationService = new ModelStateWrapper(this.ModelState);
    _memSvc = new MembershipService(_validationService);
}

在我的测试中,我可以使用 Moq 做到这一点:

var v = new Mock<ModelStateDictionary>();
_validationService = new ModelStateWrapper(v.Object);
_service = new MembershipService(_validationService);

我似乎无法让 Castle 使用 ModelStateWrapper 注入 ModelState。我不知道从哪里开始,似乎我不能只是“忽略它”并尝试手动注入,因为 Castle 正在搜索依赖项并向我抛出一个错误,说存在依赖项。

如何配置 Castle Windsor 以使用基于 IValidationDictionary 的 ModelStateWrapper 并将 ModelState 作为构造函数参数?

劳埃德

【问题讨论】:

    标签: asp.net-mvc inversion-of-control castle-windsor moq modelstate


    【解决方案1】:

    看起来你有一个循环依赖(从来都不是一件好事)。您可以通过使用 Abstract Factory 作为 described in this very similar question 来解决它。

    然而,虽然你可以像这样解决问题,但最好重新设计 API 以使循环依赖消失。循环依赖通常表明存在设计缺陷。

    【讨论】:

    • 我的帐户控制器看起来像:IMembershipService _memSvc; IValidationDictionary _validationService;公共 AccountController(IValidationDictionaryFactory 验证DFactory) { 验证DFactory.Create(this);如果是这样,我将如何在模拟模型状态的测试中运行它?抱歉,如果这些都是愚蠢的问题,我才刚接触依赖注入一天。
    • 最简单的 DI 方法是尽可能使用构造函数注入,因此通过构造函数注入所有依赖项。这也可以让您在必要时用测试替身替换它们。当您在连接时没有依赖关系时,抽象工厂是一种解决方案。这可能有很多原因。
    【解决方案2】:

    你做错了,你的错误与你使用的容器无关。

    如果你绝对需要,就这样做:

    public AccountController(IValidationService service)
    {
        _validationService = service;
        _memSvc = new MembershipService(_validationService); 
    }
    

    然后在注册组件时,使用 OnCreate 方法:

    container.Register(
       Component.For<AccountController>()
       .WheveverEleseYouNeedHere()
       .OnCreate((k, controller) => 
          controller.ValidationService.Init(controller.ModelState)));
    

    【讨论】:

    • 如果我有大约 8 个控制器,我是否必须像这样注册每个控制器才能注入模型状态?
    • 好吧,我想我在这里弄糊涂了。如果我在 web.config 中注册了我的接口,我是否可以在 WindsorControllerFactory 中使用此代码?抱歉,我认为我不太了解这一点。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多