2016-07-26 7 views
1

私はUnityを使用するための概念の証明に取り組んでいます。私は、インターセプタが呼び出される際に問題があります。私は政策注入を使用しています。問題の方法はパラメータを持たないメソッドへのUnityインターセプトのフック

今IContactを

public class Contact : BussinessObject, IContact 
{...} 

public abstract class BussinessObject 
{ 
    #region Local Vars 
    protected readonly IRepository _repository; 
    protected bool isNew; 
    #endregion Local Vars 

    #region Properties 
    /// <summary> 
    /// Gets or sets a value indicating whether this instance is new. 
    /// </summary> 
    /// <value> 
    /// <see langword="true" /> if this instance is new; otherwise, <see langword="false" />. 
    /// </value> 
    internal bool IsNew { get { return (isNew); } set { isNew = value; } } 
    #endregion 

    #region Constructors 

    /// <summary> 
    /// Initializes a new instance of the <see cref="BussinessObject"/> class. 
    /// </summary> 
    /// <param name="repository">The repository.</param> 
    public BussinessObject(IRepository repository) 
    { 
     if (repository.IsEmpty()) 
     { 
      throw new Exception("The repository is a maditory parameter for a bussiness object"); 
     } 
     _repository = repository; 
    } 

    #endregion Constructors 

    #region Methods 

    #region public 

    /// <summary> 
    /// Saves this instance. 
    /// </summary> 
    public virtual void Save() 
    { 
     Validate(); 
     SetIdenity(); 
     if (isNew) 
     { 
      Insert(); 
     } 
     else 
     { 
      Update(); 
     } 
     isNew = false; 
    } 

    /// <summary> 
    /// Permantlies the remove from system. 
    /// </summary> 
    /// <param name="ID">The identifier.</param> 
    public abstract void PermantlyRemoveFromSystem(Guid id); 

    #endregion public 

    #region Internal 

    /// <summary> 
    /// Sets the idenity. 
    /// </summary> 
    internal abstract void SetIdenity(); 

    #endregion Internal 

    #region protected 

    /// <summary> 
    /// Commons the initialize. 
    /// </summary> 
    protected virtual void CommonInit() 
    { 
     isNew = false; 
    } 

    /// <summary> 
    /// Inserts this instance. 
    /// </summary> 
    protected abstract void Insert(); 

    /// <summary> 
    /// Updates this instance. 
    /// </summary> 
    protected abstract void Update(); 

    /// <summary> 
    /// Validates this instance. 
    /// </summary> 
    protected abstract void Validate(); 

    #endregion protected 

    #endregion 
} 

に住んBussinessObjectからinherites

private void ApplyCrossCuttingConcerns(UnityContainer container) 
    { 
     container.AddNewExtension<Interception>(); 

     container.RegisterType<IContact, Contact>(
      new InterceptionBehavior<PolicyInjectionBehavior>(), 
      new Interceptor<InterfaceInterceptor>()); 
     container.Configure<Interception>() 
      .AddPolicy("extensionPolicy") 
      .AddMatchingRule<TypeMatchingRule>(new InjectionConstructor(typeof(Contact).ToString())) 
      .AddMatchingRule<MethodSignatureMatchingRule>(new InjectionConstructor("Save",new [] {""},true)) 
      .AddCallHandler<ExtensionHandler>(new ContainerControlledLifetimeManager(), new InjectionConstructor()); 

    } 

私の連絡先クラス:ので、ここで

は団結を設定するいくつかのコード

です

public interface IContact : DTO.IContact 
{ 
    void Save(); 
    void Delete(); 

    #region Phone Number Manipulation 

    bool SetDefaultNumber(PhoneNumber phNum); 
    PhoneNumber GetDefaultNumber(); 
    bool HasDefaultNumber(); 
    PhoneNumber[] GetPhoneNumbers(); 
    PhoneNumber[] GetPhoneNumbers(bool includeDeleted); 
    void AddPhoneNumber(PhoneNumber phToAdd); 
    bool RemovePhoneNumber(PhoneNumber phToRemove); 
    #endregion 

    #region Email Address Manipulation 

    bool SetDefaultEMailAddress(EmailAddress emAdd); 
    bool HasDefaultEmailAddress(); 
    EmailAddress[] GetAllEmailAddresses(); 
    EmailAddress[] GetAllEmailAddresses(bool includeDeleted); 
    EmailAddress AddEmailAddress(string addressToAdd); 
    EmailAddress GetDefaultEMailAddress(); 

    #endregion 

    #region Snailmail Address Manipulation 

    bool SetDefaultAddress(SnailMailAddress ad); 
    SnailMailAddress GetDefaultAddress(); 
    bool HasDefaultAddress(); 
    SnailMailAddress[] GetAllAddresses(); 
    SnailMailAddress[] GetAllAddresses(bool includeDeleted); 
    void AddAddress(SnailMailAddress adToAdd); 
    bool RemoveAddress(SnailMailAddress adToRemove); 

    #endregion 

} 

そして最後にextensionHandler

public class ExtensionHandler : ICallHandler 
{ 
    public int Order { get; set; } 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     //going to do our work before we pass on to the next item in the pipeline 
     SomeFunctionality handlerFunctionality = new SomeFunctionality(); 
     handlerFunctionality.PreformWork(); 

     //pass on to the next item in the pipeline 
     var result = getNext().Invoke(input, getNext); 


     //we can put post processing logic in here 


     return result; 
    } 

Iセットアップ連絡先オブジェクトを解決するために、テストして、それにデータを設定し、保存する方法と呼ばれます。 ExtensionHandlerのinvokeメソッドの先頭にブレークポイントがありますが、決してそこには到達しません。私はMethodSignatureMatchingRuleを設定する方法の問題を考えていますが、パラメータを持たないメソッドに設定されているインターセプトの例を示すネット上のドキュメントをまだ見つけていません。

すべてのヘルプはので、いくつかのより多くの実験の後、私は答え は、この問題は、マッチングルールに次のように正しいコードが正しくない 両方のルールがわかった

答えて

0

をappreaiatedされるだろう:

private void ApplyCrossCuttingConcerns(UnityContainer container) 
    { 
     container.AddNewExtension<Interception>(); 

     container.RegisterType<IContact, Contact>(
      new InterceptionBehavior<PolicyInjectionBehavior>(), 
      new Interceptor<InterfaceInterceptor>()); 
     container.Configure<Interception>() 
      .AddPolicy("extensionPolicy") 
      .AddMatchingRule<TypeMatchingRule>(new InjectionConstructor(new InjectionParameter(typeof(IContact)))) 
      .AddMatchingRule<MemberNameMatchingRule>(new InjectionConstructor(new InjectionParameter("Save"))) 
      .AddCallHandler<ExtensionHandler>(new ContainerControlledLifetimeManager(), new InjectionConstructor()); 

    } 
関連する問題