在依赖注入和ASP.NET MVC上遇到问题

时间:2009-10-28 13:51:02

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

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

例如当前代码..

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

例如Wishful pseduo code ...

public AccountController(IAccountService accountService,
    ILoggingService loggingService(this.GetType().ToString()
    .. or hardcod "X.Y..AccountController")
{ ... }
这可能吗?我猜我可能要在注册表/ bootstrap中定义一些棘手的东西?

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

请帮忙!

3 个答案:

答案 0 :(得分:1)

你能让ILoggingService成为通用的吗?然后你可以请求ILoggingService<AccountController>

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

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

答案 1 :(得分:0)

您根本无法在接口上拥有构造函数。

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

你可能有一个ILoggingService的实现,它本身需要一些依赖项,但这应该与Controller无关 - 它必须能够与 ILoggingService的任何实现一起工作,或者你将是打破Liskov替代原则。

但是,有时您需要将有关使用者的方面与依赖关系进行通信,但最好将其作为方法参数 - 例如您可以将有问题的字符串作为参数传递给ILoggingService中的方法。

答案 2 :(得分:0)

注入记录器工厂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不仅为您提供要创建的类型,还会为您提供将使用该实例的类型。