我为控制器定义了一个贪婪的构造函数。每个控制器都需要一个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,它为每个注入的实例生成唯一的对象名称。
请帮忙!
答案 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}))