2011-01-28 8 views
1

私はWCF経由で相互通信するクライアントサーバーアプリケーションを持っています。また、Castle Windsorを使用して依存関係を解決しています。城ウィンザーWCFコンベンションに基づくクライアントサービス登録

私の目標は、サーバーまたはクライアントのWCFエンドポイントを明示的に登録しなくても済むようにすることです。 は、私はこのコードは、現在のアセンブリ内のすべてのクラスを検索します

// registers all services which implement exactly 1 [ServiceContract] 
_windsorContainer.Register(
AllTypes.FromThisAssembly().IncludeNonPublicTypes().Where(
    t => 1 == (from i in t.GetInterfaces() where i.IsDefined(typeof(ServiceContractAttribute), true) select i).Count()) 
    .Configure(c => c.LifeStyle.PerWcfSession() 
    .ActAs(new DefaultServiceModel().AddEndpoints(
     WcfEndpoint.BoundTo(new NetTcpBinding()) 
      .At("net.tcp://" + LocalAddress.ToString() + ":7601/" + c.ServiceType.Name), 
     WcfEndpoint.FromEndpoint(new UdpDiscoveryEndpoint()) 
      )) 

    ).WithService.Select(
    (Type type, Type[] baseTypes) => from i in type.GetInterfaces() where i.IsDefined(typeof(ServiceContractAttribute), true) select i 
    ) 
); 

次のコードを使用して「規則」によって、サーバー側を達成している、そしてそのいずれは(のServiceContract属性によって識別される)サービス契約インターフェイスを実装しますアドレス "net.tcp:// localhost:7601/[service-contract-interface-name]"に登録されます(UDPディスカバリを使用)。

今、私はちょうど方程式のクライアント側を望んでいます。

通常、WCFの契約のためのクライアント・プロキシを生成するために城を使用するには、次のコードは動作します:城は、すべての「サービス契約の登録のこの種を行うにため

var model = new DefaultClientModel 
{ 
    Endpoint = WcfEndpoint.ForContract<IServiceContract>().BoundTo(new NetTcpBinding()).Discover(typeof(IServiceContract)) 
}; 

container.Register(
    Component.For<ChannelReconnectPolicy>(), 
    Castle.Facilities.WcfIntegration.WcfClient.ForChannels(model), 
); 

は何が欲しいです'インターフェイスは、特定のアセンブリで - しかし、AllTypesヘルパーはクラスだけではなく、(AllClassesではなく、' AllTypes 'になると推測する)インターフェイスではなく、クラスを返すようです... ...キャッスルがこれを行い、構文は何ですか?クシシュトフ? (ヘルプ!)

ありがとう!

+0

あなたはこの問題を解決しましたか?私はまったく同じことを思っています...良い質問です! +1 – Eduard

+0

ああ、私はそう思った - 私はコードを振り返らなければならない - 私はあなたに戻ってくるだろう... – Adam

+0

ポストは答えであり、それを受け入れる;)私はそれを+1する – Eduard

答えて

1

このような遅れた返事に対する謝罪 - 開発者の生活は決して静かなものではありません!

私は、コードを掘って、そのないよう...私は好きだろうと、おそらく誰かが城の中でこのような何かを統合で見ることができます...しかし、ここに「簡潔」

// these are all the namespaces that will be scanned for WCF service contracts 
string[] remoteServiceNamespaces 
    = new string[] { "MyContracts.Services", "Interlinq" }; 

// everything from here on is in the Castle DLLs (all the types) 
List<IRegistration> clientContractRegistrations = new List<IRegistration>(); 
foreach (
    var interfaceContract in 
    (from s in remoteServiceNamespaces 
    select (from i in Assembly.LoadWithPartialName(s).GetTypes() 
     where i.IsInterface 
     && 
     i.IsDefined(typeof(ServiceContractAttribute), false) 
     select i)).SelectMany(x => x) 
    ) 
{ 
    ServiceContractAttribute attr 
     = Attribute.GetCustomAttribute(
        interfaceContract, 
        typeof(ServiceContractAttribute)) 
        as ServiceContractAttribute; 
    if (null != attr) 
    { 
    WcfClientModelBase model = null; 

    // here we handle the case of the service being duplex... 
    if (null != attr.CallbackContract) 
    { 
     model = new DuplexClientModel 
     { 
     // All the automatically registered services will use NetTcp, 
     // and will discover their addresses (you could use binding 
     // inference aswell if you liked) 
     // here I have a method called 'CreateNetTcpBinding' which 
     // creates my custom binding that ALL my services use. 
     Endpoint = 
       WcfEndpoint.ForContract(interfaceContract) 
       .BoundTo(CreateNetTcpBinding()) 
       .Discover(interfaceContract) 
       .PreferEndpoint(list => list[0]) 
     }.Callback(_windsor.Resolve(attr.CallbackContract)); 
    } 
    else 
    { 
     model = new DefaultClientModel 
     { 
     Endpoint = WcfEndpoint.ForContract(interfaceContract) 
        .BoundTo(new NetTcpBinding()) 
        .Discover(interfaceContract) 
        .PreferEndpoint(list => list[0]) 
     }; 
    } 
    clientContractRegistrations.Add(WcfClient.ForChannels(model)); 
    } 
} 

// now that we've built our registration list, let's actually register 
// them all with Windsor 
_windsor.Register(
    clientContractRegistrations.ToArray() 
    ); 
関連する問題