2012-02-15 17 views
2

私はWindowsサービスでホストされているwcfサービスライブラリを持っています。 サービスメソッドへの呼び出しを傍受する必要があります。このような場合のために、このリンクで見ることができるようユニティ容器にWCFを登録することが示唆された私はどこまで理解できなかったCodeplex.IからUnity.WCFアセンブリによって、同様のアプローチを実装しようとしていますUnityコンテナでのWCFサービスの登録

http://weblogs.asp.net/fabio/archive/2009/03/24/inversion-of-control-with-wcf-and-unity.aspx

私のコンテナの設定やブートストラップをwcfサービスライブラリ(またはWindowsサービス)に入れてください。固体サンプル(溶液対)は提供されていません。

私のWindowsサービスのホスト

プライベートUnityServiceHost _serviceHost = NULL; プライベートreadonly UnityContainer _container;この場合

public Service() { 
     InitializeComponent(); 
     _container = new UnityContainer(); 
     _container.AddNewExtension<Interception>(); 
     _container.RegisterType<ISecurityRepository, SecurityRepository>(); 
     _container.Configure<Interception>().SetDefaultInterceptorFor<ISecurityRepository>(new TransparentProxyInterceptor()); 
    } 

    protected override void OnStart(string[] args) { 

     //SecurityService 
     if (_serviceHost != null) { 

      _serviceHost.Close(); 
     } else { 
      _serviceHost = new UnityServiceHost(_container, typeof(SecurityRepository)); 
      _serviceHost.Open(); 
     } 

    } 

    protected override void OnStop() { 

     //SecurityService 
     if (_serviceHost != null) { 

      _serviceHost.Close(); 
      _serviceHost = null; 
     } 
    } 

マイサービス契約

【のServiceContract(SessionMode = SessionMode.Required)] パブリックインターフェースISecurityRepository {

[OperationContract(IsInitiating = true)] 
    IList<vNavigationTree> GetNavigationTree(string ticket); 

    [OperationContract(IsInitiating = true)] 
    string GetSessionGuid(string userName, string IP, string machineName); 
} 

そのインターセプタは何をwork.Brieflyないと思われますWCFサービスがDIコンテナに登録され、サービスメソッドがインターセプトされるサンプルプロジェクトが必要です。

答えて

2

私はもっと明示的に何をしようとしたのか、どうやってそれをやったのかを説明しようとします。私はWPFアプリケーションをWCF経由でデータベースと通信しています。これは、アプリケーションがクライアント側とサーバー側(WCF)の2つに大別されることを意味します。私はPRISMによって提供されるUnityBootStrapperを介してUnityコンテナにクライアントサイドをラップしました。 Unityがサーバ側の依存関係を解決するためには、サーバ側を別のUnityコンテナにラップする必要があります。

Unity.WCFNugetパッケージとして入手可能)によって解決されました。これは、ServiceHostの代わりに使用できるUnityServiceHostクラスを提供します。このパッケージは、この投稿が説明する方法で作成されていると思います。

http://weblogs.asp.net/fabio/archive/2009/03/24/inversion-of-control-with-wcf-and-unity.aspx

1

ユニティインターセプトパイプラインを利用する必要があります。

Unityには、aopの実装を容易にする組み込みポリシー注入動作が用意されています。ポリシーインジェクションの振る舞いは、メソッドごとにコールハンドラとマッチングルールを使用して、特定のメソッドにいくつかの機能をアタッチまたは注入します。

a。 ICallhandlerのカスタムインターフェイスから始めましょう。

>> public interface ILogAttributeHandler : ICallHandler 
>> { 
>> } 
>> 

b。ハンドラの実装を追加します。メソッドがインターセプトされたときに適用するアドバイスです。

>> public class ActivityAttributeHandler : ILogAttributeHandler 
>> { 
>> public ActivityAttributeHandler(string activityType) 
>> { 
>> ActivityType = activityType; 
>> } 

>> private string ActivityType { get; set; } 
>> public int Order { get; set; } 

>> public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
>> { 
>>   //// Invoke the handler 
>>   IMethodReturn output = getNext()(input, getNext); 

>>   //// Perform post-processing task 
>>   var agent = output.ReturnValue as Agent; 

>>   if (agent != null) 
>>   { 
>>    //// do work here 
>>   } 

>>   return getNext()(input, getNext); 
>>  } 
} 

c。カスタム属性を作成します。これは、プログラムのポイントカットとして使用されます。

>> [AttributeUsage(AttributeTargets.Method)] 
>> public class ActivityAttribute : HandlerAttribute 
>> { 
>>  private readonly string _activityName; 

>>  public ActivityAttribute(string activityName) 
>>  { 
>>   _activityName = activityName; 
>>  } 
>> } 
>>  public override ICallHandler CreateHandler(IUnityContainer container) 
>>  { 
>> return null; 
>>} 

d。ここで残しておいたのは、統一構成内に傍受を構成し、傍受したいサービスインタフェース操作に属性を追加することだけです。

> container 
>     .RegisterType<ILogAttributeHandler, LogAttributeHandler>() 
>     .AddNewExtension<Interception>() 
>     .Configure<Interception>() 
>    .SetInterceptorFor<ISecurityRepository>("SecurityRepository", new 
> InterfaceInterceptor()); 

e。インターフェイス操作にアトリビュートを適用する

>>public interface ISecurityRepository 
>> { 
>> [OperationContract(IsInitiating = true)] 
>> [Activity("Logon")] 
>> IList<vNavigationTree> GetNavigationTree(string ticket) 
>>} 
関連する問題