У меня есть клиент-серверное приложение, которое взаимодействует через WCF.Оба они также используют Castle Windsor для разрешения зависимостей.
Моя цель - полностью избежать необходимости регистрировать конечные точки сервера или клиента 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) будет зарегистрирован (с обнаружением UDP) по адресу "net.tcp: // localhost: 7601 / [service-contract-interface-name]".
Теперь я просто хочу на стороне клиентауравнение.
Как правило, чтобы использовать Castle для генерации прокси-клиентов для контрактов 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),
);
Я хочу, чтобы Castle выполнял такого родарегистрация для всех интерфейсов «сервис-контракт» в данной сборке - однако помощник AllTypes, похоже, возвращает только классы, а не интерфейсы (что, я думаю, делает его «AllClasses», а не «AllTypes»!) ... Может ли Касл сделать этои какой синтаксис?Кшиштоф?(помогите!)
Спасибо!