【问题标题】:Dependency Injection and ModelStateWrapper依赖注入和 ModelStateWrapper
【发布时间】:2009-04-21 14:26:11
【问题描述】:

在教程中Validating with a service layer Product Service 的构造函数如下所示:

ProductService(IValidationDictionary validationDictionary, IProductRepository repository)

它在默认控制器构造函数中的实例是这样创建的:

public ProductController() 
{   
    _service = new ProductService(new ModelStateWrapper(this.ModelState), new roductRepository());

}

如果我想使用 Unity 进行 DI,显然应该使用第二个构造函数。

public ProductController(IProductService service)
{
    _service = service;
}

但是我不知道配置Unity注入ProductServise的第一个参数,因为ModelStateWrapper使用来自控制器的ModelState,它是在控制器内部创建的,无法注入。是否可以将这种依赖注入到ProductService?

【问题讨论】:

    标签: asp.net-mvc dependency-injection unity-container


    【解决方案1】:

    想一想。

    这是你想要做的:

    • 要创建产品控制器,您需要产品服务
    • 为了创建产品服务,您需要产品控制器

    你有一个恶性循环,这就是你做不到的原因。

    我不知道 Unity 的实现,但从概念上讲,你需要打破循环,像这样:

    • 创建产品控制器而不向其传递产品服务
    • 创建产品服务并将产品控制器的模型状态传递给它
    • 通过属性注入将产品服务注入产品控制器

    AFAIK unity 确实支持属性注入,但它需要您将属性放到属性上。如果我是你,我会考虑使用侵入性较小的容器(几乎任何其他都更好)。

    【讨论】:

    • 谢谢,现在我看到我在这里有一个循环依赖项。我通过使用这样的通用方法创建了一个 UnityHelper 来解决它: public TManager CreateEntityManager(TInnerInterface innerImplementation) { this.RegisterInstance(innerImplementation);返回 this.Resolve();比我做这样的解决: IProductService target = unity.CreateEntityManager(modelStateWrapper);感谢您的帮助/erik
    • 遇到同样的挑战,但使用 ASP.NET CORE MVC?有什么建议吗?
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2012-02-15
    • 2011-05-11
    • 2011-04-04
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多