PRISM = 6.3; Unity拦截= 5.3;
我正在重构一个类,使用Unity拦截和PRISM viewModelLocator = true删除横切关注点。
在模块I中注册接口和类以及识别拦截器:
Container.RegisterType<ITaxViewModel, TaxViewModel>(
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<LoggingInterceptionBehavior>());
我运行应用程序,然后按下税按钮,我收到以下错误:
System.Windows.Markup.XamlParseException HResult = 0x80131501
消息=&#39;设置属性&#39; Prism.Mvvm.ViewModelLocator.AutoWireViewModel&#39; 抛出异常。&#39;行号&#39; 8&#39;和行位置&#39; 14&#39; 源= PresentationFrameworkStackTrace:at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory,Boolean skipJournaledProperties,Object rootObject, XamlObjectWriterSettings设置,Uri baseUri)
在System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader) xamlReader,Boolean skipJournaledProperties,Object rootObject, XamlAccessLevel accessLevel,Uri baseUri)
在System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext,Object parent,Boolean closeStream)
在System.Windows.Application.LoadComponent(对象组件,Uri resourceLocator)
在FOO.Views.TaxView.InitializeComponent()
在C:\ FooControlLibrary \ Views \ TaxView.xaml:第1行
内部异常1:ActivationException:发生激活错误 在尝试获取TaxViewModel类型的实例时,键&#34;&#34;
内部异常2:ResolutionFailedException:解决方案 依赖失败,输入=&#34; FOO.VM.TaxViewModel&#34;,name =&#34;(none)&#34;。 在解决时发生异常:例外情况是: ArgumentException - 类型FOO.VM.TaxViewModel不可拦截。 参数名称:interceptedType
在例外时,容器是:
解析FOO.VM.TaxViewModel,(无)
内部异常3:ArgumentException:类型FOO.VM.TaxViewModel是 不可拦截。参数名称:interceptedType
我不确定PRISM是否可以解析Unity创建的代理。有谁知道怎么做?
答案 0 :(得分:0)
我可以没有例外。 棱镜统一性:6.3.0 Unity.Interception:4.0.1
protected override DependencyObject CreateShell()
{
Container.AddNewExtension<Interception>();
Container.RegisterType<jobsRepository>(new Interceptor<VirtualMethodInterceptor>(),
new InterceptionBehavior<LogBehavior>());
var jobsRepo = Container.Resolve<jobsRepository>();
jobsRepo.GetJobs();
return Container.Resolve<MainWindow>();
}
IInterceptionBehavior
public class LogBehavior : IInterceptionBehavior
{
public bool WillExecute => true;
public IEnumerable<Type> GetRequiredInterfaces()
{
return Enumerable.Empty<Type>();
}
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Debug.WriteLine("# before: " + input.MethodBase.Name);
var result = getNext()(input, getNext);
Console.WriteLine($"# end:{input.MethodBase.Name}");
return result;
}
}