2009-10-28 28 views
1

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

如当前代码..

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

如如意pseduo代码...

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

这可能吗?我猜我可能不得不在注册表/ bootstrap中定义一些棘手的问题?

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

请帮忙!

回答

1

你可以让ILoggingService成为一个通用的吗?那么你可以要求ILoggingService<AccountController>

你的日志服务可以利用它,像这样:

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

你不能有一个构造函数的接口上的。

DI和松耦合的其中一点是协作者​​只通过接口彼此了解。如何创建实例并不关心消费者。

你可能有ILoggingService的实现,本身需要一定的依赖性,但应该是没有关心到控制器的 - 它必须能够与工作的任何实施ILoggingService的,否则你会被打破Liskov替换原理。

然而,有时您需要将消费者的方面与依赖关系进行交流,但这最好作为方法参数完成 - 例如,您可以将相关字符串作为参数传递给ILoggingService中的方法。

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不仅给你创建的类型,而且还会让你使用实例的类型。