【问题标题】:Having trouble with Dependency Injection and ASP.NET MVC依赖注入和 ASP.NET MVC 遇到问题
【发布时间】:2010-12-10 21:04:01
【问题描述】:

我为我的控制器定义了一个贪婪的构造函数。每个控制器都需要一个 ILoggingService 实例。现在我的依赖注入(即 StructureMap .. 但如果你不使用它,请继续阅读)工作正常.. 但我希望 ILoggingService 贪婪构造函数需要 String。此值将是控制器的完全限定名称.. 或一些文本(如果这太难了)。

例如当前代码..

public AccountController(IAccountService accountService,
    ILoggingService loggingService) { ... }

例如如意的伪代码...

public AccountController(IAccountService accountService,
    ILoggingService loggingService(this.GetType().ToString()
    .. or hardcod "X.Y..AccountController")
{ ... }

这可能吗?我猜我可能需要在注册表/引导程序中定义一些棘手的东西?

注意:我尝试过使用反射,但这不起作用,因为 IoC 使用了一个实例生成器,它为每个注入的实例生成一个唯一的对象名称。

请帮忙!

【问题讨论】:

    标签: asp.net-mvc dependency-injection structuremap


    【解决方案1】:

    您能否将 ILoggingService 设为泛型?然后你可以请求ILoggingService<AccountController>

    您的日志服务可以像这样使用它:

    class LoggingService<T> : ILoggingService<T>{
       ...
       var thingName=typeof(T).ToString();
       ...
    }
    

    【讨论】:

      【解决方案2】:

      接口上根本不能有构造函数。

      DI 和松耦合的一个要点是协作者​​只通过接口相互了解。实例的创建方式与消费者无关。

      您可能有一个 ILoggingService 实现,它本身需要一些依赖项,但这与控制器无关 - 它必须能够与 ILoggingService 的 任何 实现一起使用,否则您将打破了 Liskov 替换原则。

      但是,有时您需要将有关消费者的方面传达给依赖项,但这最好作为方法参数来完成 - 例如您可以将有问题的字符串作为参数传递给 ILoggingService 中的方法。

      【讨论】:

        【解决方案3】:

        注入记录器工厂 ILoggerFactory,你可以要求一些名称的记录器:this.logger = _factory.GetLogger(GetType().Name())。

        请注意,这不是 IoC 特定的解决方案。我不是 IoC 方面的专家(尽管我使用 Windsor),所以他们可能会提供手动实例化的方法。类似的东西

        ioc.ForComponent(typeof(ILoggerService)).CustomInstantiate((type, desttype) => 
             Activator.CreateInstance(type, new object[]{desttype.Name}))
        
        • 但我对此一无所知。尤其是考虑到您希望 IoC 不仅为您提供要创建的类型,还为您提供将要使用实例的类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-26
          • 1970-01-01
          • 2020-05-27
          • 1970-01-01
          • 2014-02-25
          相关资源
          最近更新 更多