3
|
mr.b Scott Lystig Fritchie · 技术社区 · 14 年前 |
1
2
相互呼应;DI是一条路要走。动态代理在这方面非常胜任。 下面是一些示例代码,包括所有必需的实现。通常,根据接口编写代码是一种很好的做法。 Help and Information about Aspect Oriented Programming (编辑:因为你很好,给了我一些分数,这里有另一个很酷的链接到DP教程,它做得很好: http://kozmic.pl/archive/2009/04/27/castle-dynamic-proxy-tutorial.aspx ;)) 下面是示例代码:
控制台输出 Examples.A.AMethod called with arguments 3,1415926535 A method impl After invocation. Return value 6,283185307 End of test |
2
2
1-您可以从 RealProxy
可按如下方式使用
上面的代码将记录在MyClass的代理实例上设置年龄的调用。 2-另一个替代方法,但更多的工作是创建一个代理类,该类动态生成一个从传入的类型派生的类型,并提供基类型中所有方法和属性的实现。生成的方法等将执行日志调用基类实现等,类似于RealProxy示例。使用VSVAR类型,您可能不需要从该类型实际继承,而是使用此代理的聚合,这样您仍然可以获得IntelliSense支持,而不需要将所有方法/属性都设置为虚拟的。对不起,没有例子,现在这个有点太多了。但你可以看看 CodeDom 或者更好 Reflection.Emit 对于动力型建筑。动态代码可以做一些类似于@tvanfosson答案中提出的事情。 最后你可以用 DynamicObject
它的用法如下
有几个选项可以滚动您自己的解决方案,或者您可以查看一些预先备份的解决方案。这可能是一个更好的方法,但这应该让您了解一些解决方案是如何实现的。 |
3
1
这对于您的特定用例来说可能太重了,但您可能需要研究Castle Dynamic Proxy: 这个框架允许您在运行时动态地为类创建代理,允许您截获所有调用并注入所需的任何逻辑。 |
4
0
我的方法是使用依赖注入,并将logger实例传递给需要进行日志记录的类。如果您有一个支持基于属性的过滤的框架,比如MVC,那么您也可以使用这些框架,尽管您可能会受限于可以记录的内容。
或者在MVC中,或者一个理解属性并可以在方法调用之前调用它们的合适框架。
最后一个选择,我能想到的,你已经说过你不想使用,是装饰图案。在这种情况下,您的代理类和代理类需要实现相同的接口,您只需使用所需的功能包装代理类。请注意,定义接口——并在需要向日志类添加功能时扩展接口——可以防止您忘记扩展代理以使其与日志类保持同步。因为它实现了接口,所以除非它拥有所有的接口方法,否则它不会编译。
|
5
0
另一个选择是面向方面的框架,如PostSharp: 这允许您定义注入代码的属性,这些代码将在方法调用期间的某个点被调用(OnEntry、OnExit、OnException等)。 不 |
Robert King · Unity C#语法问题-转换位置 1 年前 |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
i_sniff_ket · 在unity之外使用unity类 2 年前 |