Prism Unity拦截错误

时间:2018-01-08 00:16:38

标签: c# wpf unity-container prism

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;   源= PresentationFramework

     

StackTrace: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创建的代理。有谁知道怎么做?

1 个答案:

答案 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;
    }
}