首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决多重继承(用于预熟类)

解决多重继承(用于预熟类)
EN

Stack Overflow用户
提问于 2013-02-20 11:45:18
回答 2查看 270关注 0票数 0

我需要什么:一个有双亲的类,即ContextBoundObject和另一个类。

为什么是:我需要访问ContextBoundOject来记录方法调用。

组合工作?到目前为止,没有(类型未被识别,除其他外)。

还有其他的方法吗?是的,但是没有第三方组件就不那么自动化了(也许T4可以做到,但我不是专家)。

更详细的解释。

我需要扩展系统类(其中一些类已经具有MarshalByRefObject (它是ContextBoundObject的父类)用于父类,例如ServiceBaseFileSystemWatcher,而有些类不是,例如ExceptionTimer),以访问框架的一些内部工作,因此我可以记录方法调用(现在;将来可能会改变)。

如果使用这种方式,我只需向我想要记录的对象添加一个类名,而不是将日志记录调用添加到每个方法,但显然我不能这样做:

代码语言:javascript
复制
public class MyService:ServiceBase,ContextBoundObject,IDisposable{
    public MyService(){}
    public Dispose(){}
}

因此,您可以尝试通常的解决方案,接口,但是如果我调用Run,如

代码语言:javascript
复制
ServiceBase.Run(new MyService());

使用一个假设的接口IServiceBase是行不通的,因为ServiceBase类型不能传递给IServiceBase --它不能继承任何接口。除例外情况外,问题更严重:throw只接受从Exception降下来的类型。

相反,生成一个IContextBoundObject接口似乎也不起作用:日志机制不通过方法工作,所以我不需要实现任何属性和一些小的内部类(并且继承自ContextBoundObject,甚至从MarshalByRefObject继承,因为元数据实际上是相同的)。

据我所见,从ContextBoundObject扩展将扩展类放入Proxy (可能是因为以这种方式方法调用使用SyncProcessMessage(IMessage),因此可以被截获和记录),也许有一种方法不需要继承就可以这样做,或者可能有可以使用日志记录调用的前后编译技术(比如T4文本模板),我不知道。

如果有人想看一看,我在我的程序中使用了MSTestExtentions的自定义版本来记录(方法调用)。任何想法都会受到赞赏。可能需要更多的解释,只需问一问。

EN

回答 2

Stack Overflow用户

发布于 2013-02-20 11:49:11

日志方法调用通常使用属性对您希望启用日志记录的类或方法进行注释。这叫做面向方面编程

为此,您需要一个软件来理解这些属性,并通过向已注释的方法/类添加必要的代码来对程序集进行后置处理。

对于C#,存在PostSharp。有关介绍,请参见这里

票数 0
EN

Stack Overflow用户

发布于 2013-02-21 08:45:52

对代理进行实验,我发现了一种明显记录显式调用的方法。

本质上,我创建了一个类似于msdn中的RealProxy,然后获取TransparentProxy并将其用作普通对象。

日志记录是在自定义的Invoke类中重写的RealProxy方法中完成的。

代码语言:javascript
复制
static void Main(){
...
    var ServiceClassProxy=new ServiceRealProxy(typeof(AServiceBaseClass),new object[]{/*args*/});
    aServiceInstance=(AServiceBaseClass)ServiceClassProxy.GetTransparentProxy();
    ServiceBase.Run(aServiceInstance);
...
}

在代理类中,Invoke将执行如下操作:

代码语言:javascript
复制
class ServiceRealProxy:RealProxy{
...
    [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)]
    public override IMessage Invoke(IMessage myIMessage){
        // remember to set the "__Uri" property you get in the constructor
    ...
        /* logging before */
        myReturnMessage = ChannelServices.SyncDispatchMessage(myIMessage);
        /* logging after */
    ...
        return myReturnMessage;

        // it could be useful making a switch for all the derived types from IMessage; I see 18 of them, from
        // System.Runtime.Remoting.Messaging.ConstructionCall
        // ... to
        // System.Runtime.Remoting.Messaging.TransitionCall
    }
...
}

我还需要进行广泛的调查,但是伐木发生了。这不是我最初问题的答案,因为我仍然需要在不从MarshalByRefObject继承的类上测试这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14979051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档