Как перехватить вызов соответствующего метода? - PullRequest
2 голосов
/ 23 июня 2011

Ниже приведена моя конфигурация, и я хочу перехватить вызов соответствующего метода.Что я должен сделать, чтобы добавить методы сопоставления?

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">

    <sectionExtension
   type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,
                    Microsoft.Practices.Unity.Interception.Configuration" />

    <alias alias="IDAL" type="InterceptionBlockApplication.IDAL,InterceptionBlockApplication"/>
    <alias alias="DALTest" type="InterceptionBlockApplication.DALTest,InterceptionBlockApplication"/>

    <container name="DALTest">



      <extension type="Interception"/>

      <interception>
        <policy name="TestPolicy">
          <matchingRule name="Method Signature Matching Rule"  type="MemberNameMatchingRule">

            <method name="MethodA"/>
            <method name="MethodB">

            </method> I try to do that. But it will throw a exception that:

           [ Configuration is incorrect, the type Microsoft.Practices.Unity.InterceptionExtension.MemberNameMatchingRule does not have a method named MethodA that takes parameters named .] 

         What should I do?

          </matchingRule>
          <callHandler name="MyLogCallHandler" type="InterceptionBlockApplication.MyLogCallHandler, InterceptionBlockApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
          </callHandler>
        </policy>
      </interception>

      <register type="IDAL" mapTo="DALTest" name="DALTest">
        <interceptor isDefaultForType="false" type="VirtualMethodInterceptor"/>
      </register>




    </container>
  </unity>

Любая помощь будет признательна.

1 Ответ

1 голос
/ 17 июня 2014

Класс MemberNameMatchingRule имеет несколько конструкторов. Например, для одного метода:

<matchingRule name="rule1" type="MemberNameMatchingRule">
        <constructor>
          <param name="nameToMatch" >
            <value value="MethodA"/>
          </param>
        </constructor>
      </matchingRule>

Другие конструкторы, которые вы можете использовать:

public MemberNameMatchingRule(
IEnumerable<MatchingInfo> matches
)
public MemberNameMatchingRule(
IEnumerable<string> namesToMatch
)
public MemberNameMatchingRule(
string nameToMatch
)
public MemberNameMatchingRule(
IEnumerable<string> namesToMatch,
bool ignoreCase
)
public MemberNameMatchingRule(
string nameToMatch,
bool ignoreCase
)

Если вам нужно передать IEnumerable, вы можете прочитать и следовать статье ниже: Как настроить Unity для вставки массива для IEnumerable

ИЛИ использовать подстановочный знак, например:

<matchingRule name="rule2" type="MemberNameMatchingRule">
        <constructor>
          <param name="nameToMatch" >
            <value value="Method*"/>
          </param>
          <param name="ignoreCase" value="true"/>
        </constructor>
      </matchingRule>
...