2016-06-28 1 views
1

Я разработал простой тестовый образец и использовал библиотеку moq. Но при выполнении метода Container.Resolve<IInterface>() возникает исключение. Ниже приводится метод регистрации для замок Виндзор:Невозможно применить проблемы с комиссией к компоненту. Поздняя привязка, потому что она является прокси-сервером без цели. В настоящее время они не поддерживаются

container.Register(Component.For<TBase>().UsingFactoryMethod(() => 
{ 
    var mockObject = new Mock<TBase>(); 
    var mockType = typeof(TBase); 

    if (container is Core.IoCContainer.IoCCore.CustomContainer) 
    { 
     var resolvingDelege = (container as Core.IoCContainer.IoCCore.CustomContainer).ResolvingTestDelegateList[mockType]; 

     if (resolvingDelege != null) 
     { 
      resolvingDelege(mockType, mockObject); 
     } 
    } 

    return mockObject.Object; 
}) 
.LifestyleTransient()); 

при выполнении IoCCore.Container.Resolve< ISampleDataContext>();, исключение бросают. Сообщение об исключении: «Невозможно применить проблемы с комиссией к компоненту Late bound Data.Context.ISampleDataContext, потому что он является прокси-сервером без цели. В настоящее время они не поддерживаются».

Я искал проблему и нашел, что mockObject.Object is Castle.DynamicProxy.IProxyTargetAccessor. Таким образом, при решении экземпляра, то код, приведенный ниже в Castle.MicroKernel.ComponentActivator.AbstractComponentActivator классе, где возникает проблема:

protected virtual void ApplyCommissionConcerns(object instance) 
    { 
     if (Model.Lifecycle.HasCommissionConcerns == false) 
     { 
      return; 
     } 

     instance = ProxyUtil.GetUnproxiedInstance(instance); 
     if (instance == null) 
     { 
      // see http://issues.castleproject.org/issue/IOC-332 for details 
      throw new NotSupportedException(string.Format("Can not apply commission concerns to component {0} because it appears to be a target-less proxy. Currently those are not supported.", Model.Name)); 
     } 
     ApplyConcerns(Model.Lifecycle.CommissionConcerns, instance); 
    } 

Объект решается с помощью UsingFactoryMethod является Castle.DynamicProxy.IProxyTargetAccessor, который создается фиктивного объекта. Но, замок Виндзор предполагает, что IProxyTargetAccessor создан сам по себе, а не макет объекта. Это приводит к тому, что из моего экземпляра mock возвращается пустой экземпляр CommissionConcerns.

Возможно ли обходное решение для этой ошибки? Должен ли я ждать обновления?

ответ

0

Я разработал обходной путь для решения этой проблемы. Я изменил метод UseFactoryMethod вместо кода ниже

Component.For<TBase>().UsingFactoryMethod(() => 
      { 
       var mockObject = new Mock<TBase>(); 
       var mockType = typeof(TBase); 

       if (container is Core.IoCContainer.IoCCore.CustomContainer) 
       { 
        var resolvingDelege = (container as Core.IoCContainer.IoCCore.CustomContainer).ResolvingTestDelegateList[mockType]; 

        if (resolvingDelege != null) 
        { 
         resolvingDelege(mockType, mockObject); 
        } 
       } 

       //The code that was changed 
       //============================================== 
       var type = mockObject.Object.GetType(); 
       var field = type.GetField("__target"); 

       field.SetValue(mockObject.Object, new Object()); 
       //============================================== 

       return mockObject.Object; 
      }) 
      .LifestyleTransient()); 
Смежные вопросы