Unity自动注入

4
我已经完成了以下操作:
  1. 通过ILogger接口,在Unity中注册了我的Logger实例。
  2. 创建了一个名为ILoggableObject的接口,其中包含了一个名为Hook(ILogger logger)的方法,用于注入我的Logger。
我希望能够实现以下功能:每当我从Unity中请求任何解析对象时,如果该对象实现了ILoggableObject接口,则自动通过Hook方法注入ILogger接口。
我认为这可以通过拦截或策略来实现?是否有任何帮助?

3
为什么不使用构造函数注入,这是默认机制?只需将Hook方法重命名为公共构造函数(带有相同的参数)即可。 - Steven
你可以使用命名参数来调用构造函数以避免这种情况。 - Saeed Amiri
@Saeed,我不是很清楚命名参数如何避免向我的构造函数添加参数。 - poindexter12
5
@poindexter12: 你不应该有一个接受10个参数的构造函数,最多只能有5-6个。如果确实需要这么多参数,那么显然有些地方是有问题的。这种情况下,应该将这个类重构成更小的部分。 - Robin Orheden
@Robin,这正是我想做的事情。我有一个ILogger,希望我的所有类都可以访问它。记录功能被隔离在一个记录类中。不幸的是,我还有一些其他实用程序(对话框、错误等)也被隔离在其他类中。我不想在构造函数中传递它们,我只是想将它们注入到一个基类中,以便其他人不必担心它们,只需使用它即可。 - poindexter12
显示剩余2条评论
3个回答

2
你要找的是Unity中的TypeInterception。请参见这里:http://msdn.microsoft.com/en-us/library/ff660861(PandP.20).aspx。另外,还可以看这里:http://msdn.microsoft.com/en-us/library/ff660848(v=PandP.20).aspx
你想要拦截构造函数的调用,并代表调用代码注入Logger,而不让他们知道。虽然我以前没有做过,但我相信你可以使用Intercept.NewInstance()来实现你想要的功能。请参见http://msdn.microsoft.com/en-us/library/ff662093(PandP.20).aspx

1

这是一种可怕的依赖注入方式(尝试)。相反,使用构造函数注入,并将ILogger通过构造函数注入到当前具有Hook方法的消费者中。


这完全没有回答我的问题。虽然我感谢您的反馈,但我正在转向另一种方法,因为我在上面发表了评论。 - poindexter12
2
然而,这个理由是一个谬论:太多的构造函数参数并不意味着构造函数注入有问题,而是你的类承担了太多的职责。 - Mark Seemann
好的,我读了你的博客文章。很棒。我同意你所有的原则。但我并不认为你试图回答我的问题。虽然你喜欢构造函数注入,但其他人可能喜欢属性或方法注入。原则是相同的。我同意,将所有辅助服务聚合到一个聚合服务中是很好的。我会立即尝试做到这一点。我的问题仍然存在。如果我有一个聚合服务,我希望通过方法或属性自动注入,怎么能自动完成呢? - poindexter12
2
很抱歉我没有提供更有建设性的意见,但看起来你已经得到了你想要的答案。不过,就记录而言,我不认为在构造函数、属性或方法注入之间做出选择只是一种口味问题。它们各自在不同的情况下都是适当的。 - Mark Seemann

0

虽然我非常喜欢Unity和IoC/DI,但我不确定它是否是实现你想要做的事情的正确工具。

你可以考虑使用面向切面编程,例如PostSharp或类似的工具。这将允许你添加日志记录或其他横切关注点,而无需更改被检测的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接