Caliburn with Castles DynamicProxy:找不到视图

Caliburn with Castles DynamicProxy:找不到视图,dynamic,proxy,caliburn.micro,caliburn,Dynamic,Proxy,Caliburn.micro,Caliburn,对于我正在进行的一个项目,我尝试将caliburn与castles dynamicProxy结合起来。我的目标是拦截视图调用的视图模型对象的所有方法。Caliburn根据约定自动附加视图模型方法(这是Caliburn用于连接视图模型方法的原理,例如,按钮命令)视图的特定元素。因此,我重写了用于实例化ViewModel类的caliburns GetInstance方法。在此方法中,我使用dynmiac代理包装每个viewmodel,然后返回它: protected override object

对于我正在进行的一个项目,我尝试将caliburn与castles dynamicProxy结合起来。我的目标是拦截视图调用的视图模型对象的所有方法。Caliburn根据约定自动附加视图模型方法(这是Caliburn用于连接视图模型方法的原理,例如,按钮命令)视图的特定元素。因此,我重写了用于实例化ViewModel类的caliburns GetInstance方法。在此方法中,我使用dynmiac代理包装每个viewmodel,然后返回它:

protected override object GetInstance(Type serviceType, string key)
{
    var instance = container.GetInstance(serviceType, key);

    if (instance != null)
    {
        object ret = pg.CreateClassProxyWithTarget(instance.GetType(), (instance), new LoggingInterceptor());
        return ret;
    }

    throw new Exception("Could not locate any instances.");
    //return null;
}
不幸的是,在此更改之后,我的视图仅显示

Cannot find view for Castle.Proxies.FirstViewModelProxy.
因为我知道castles dynamicproxy将字符串“Proxy”添加到新创建类型的末尾,caliburn将替换字符串末尾的单词Model,然后尝试使用此字符串查找相应的视图,所以我添加了另一个NameTransformer规则:

public CaliburnBootstrapper() 
    {
        LogManager.GetLog = type => new DebugLogger(type);
        Initialize();
        ViewLocator.NameTransformer.AddRule("ModelProxy$", string.Empty);
    }

然而,这并没有改变任何事情。如何解决这个问题?

经过进一步的研究,我发现自己该如何做:Caliburn允许交换负责将视图模型的名称转换为视图的方法。因此,我所做的就是在我自己的程序中调用原始名称转换方法。当它不返回任何内容时,我尝试自己的逻辑。这就成功了

        Func<string, object, IEnumerable<string>> orig = ViewLocator.TransformName;
        ViewLocator.TransformName = new Func<string,object,IEnumerable<string>>(
            delegate(string a, object b )
            {
                IEnumerable<string> ret =  orig(a,b);
                if (ret.Count() > 0)
                {
                    return ret;
                }

                a = Regex.Replace(a, "^Castle.Proxies", "CaliburnSample.Views");
                a = Regex.Replace(a, "ModelProxy$", string.Empty);
                a = Regex.Replace(a, "Model$", string.Empty);
                return new string[] { a };
            }
        );

经过更多的研究之后,我发现了如何做到这一点:Caliburn允许交换负责将视图模型的名称转换为视图的方法。因此,我所做的就是在我自己的程序中调用原始名称转换方法。当它不返回任何内容时,我尝试自己的逻辑。这就成功了

        Func<string, object, IEnumerable<string>> orig = ViewLocator.TransformName;
        ViewLocator.TransformName = new Func<string,object,IEnumerable<string>>(
            delegate(string a, object b )
            {
                IEnumerable<string> ret =  orig(a,b);
                if (ret.Count() > 0)
                {
                    return ret;
                }

                a = Regex.Replace(a, "^Castle.Proxies", "CaliburnSample.Views");
                a = Regex.Replace(a, "ModelProxy$", string.Empty);
                a = Regex.Replace(a, "Model$", string.Empty);
                return new string[] { a };
            }
        );