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