私は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 'になると推測する)インターフェイスではなく、クラスを返すようです... ...キャッスルがこれを行い、構文は何ですか?クシシュトフ? (ヘルプ!)
ありがとう!
あなたはこの問題を解決しましたか?私はまったく同じことを思っています...良い質問です! +1 – Eduard
ああ、私はそう思った - 私はコードを振り返らなければならない - 私はあなたに戻ってくるだろう... – Adam
ポストは答えであり、それを受け入れる;)私はそれを+1する – Eduard