示例#1
0
        public override object Create(IKernel kernel, object instance, ComponentModel model,
                                      CreationContext context, params object[] constructorArguments)
        {
            var channelHolder = instance as IWcfChannelHolder;

            if (channelHolder == null)
            {
                throw new ArgumentException(string.Format("Given instance is not an {0}", typeof(IWcfChannelHolder)), "instance");
            }

            if (channelHolder.RealProxy == null)
            {
                return(channelHolder.Channel);
            }

            if (model.Services.Count() > 1)
            {
                throw new ArgumentException(string.Format(
                                                "Component {0}, which was designated as a WCF proxy exposes {1} services. The facility currently only supports single-service components.",
                                                model.Name, model.Services.Count()));
            }

            var isDuplex             = IsDuplex(channelHolder.RealProxy);
            var proxyOptions         = model.ObtainProxyOptions();
            var serviceContract      = model.GetServiceContract();
            var generationOptions    = CreateProxyGenerationOptions(serviceContract, proxyOptions, kernel, context);
            var additionalInterfaces = GetInterfaces(model.Services, proxyOptions, isDuplex);
            var interceptors         = GetInterceptors(kernel, model, serviceContract, channelHolder, context);

            return(generator.CreateInterfaceProxyWithTarget(typeof(IWcfChannelHolder),
                                                            additionalInterfaces, channelHolder, generationOptions, interceptors));
        }
示例#2
0
        private static ChannelCreator CreateChannelCreatorInternal <TModel>(
            IKernel kernel, IWcfClientModel clientModel, ComponentModel model, out IWcfBurden burden)
            where TModel : IWcfClientModel
        {
            var channelBuilder = kernel.Resolve <IChannelBuilder <TModel> >();

            return(channelBuilder.GetChannelCreator((TModel)clientModel, model.GetServiceContract(), out burden));
        }
示例#3
0
        private void Kernel_ComponentModelCreated(ComponentModel model)
        {
            var clientModel = ResolveClientModel(model);

            if (clientModel != null && model.Implementation == model.GetServiceContract())
            {
                model.CustomComponentActivator = typeof(WcfClientActivator);
                model.ExtendedProperties[WcfConstants.ClientModelKey] = clientModel;
                model.Lifecycle.Add(DisposalConcern.Instance);

                var dependencies = new ExtensionDependencies(model, kernel)
                                   .Apply(new WcfEndpointExtensions(WcfExtensionScope.Clients))
                                   .Apply(clientModel.Extensions);

                if (clientModel.Endpoint != null)
                {
                    dependencies.Apply(clientModel.Endpoint.Extensions);
                }
            }
        }
示例#4
0
        private static void ValidateClientModel(IWcfClientModel clientModel, ComponentModel model)
        {
            if (clientModel.Endpoint == null)
            {
                throw new FacilityException("The client model requires an endpoint.");
            }

            var contract = clientModel.Contract ?? model.GetServiceContract();

            if (contract == null)
            {
                throw new FacilityException("The service contract for the client endpoint could not be determined.");
            }

            if (model.Services.Contains(contract) == false)
            {
                throw new FacilityException(string.Format(
                                                "The service contract {0} is not supported by the component {0} or any of its services.",
                                                clientModel.Contract.FullName, model.Implementation.FullName));
            }
        }
示例#5
0
        public override object Create(IKernel kernel, object instance, ComponentModel model,
                                      CreationContext context, params object[] constructorArguments)
        {
            var channelHolder = instance as IWcfChannelHolder;

            if (channelHolder == null)
            {
                throw new ArgumentException(string.Format("Given instance is not an {0}", typeof(IWcfChannelHolder)), "instance");
            }

            var isDuplex          = IsDuplex(channelHolder.RealProxy);
            var proxyOptions      = model.ObtainProxyOptions();
            var serviceContract   = model.GetServiceContract();
            var remainingServices = model.Services.Except(new[] { serviceContract });
            var generationOptions = CreateProxyGenerationOptions(serviceContract, proxyOptions, kernel, context);

            generationOptions.AddMixinInstance(channelHolder);
            var additionalInterfaces = GetInterfaces(remainingServices, proxyOptions, isDuplex);
            var interceptors         = GetInterceptors(kernel, model, serviceContract, channelHolder, context);

            return(generator.CreateInterfaceProxyWithTargetInterface(serviceContract,
                                                                     additionalInterfaces, channelHolder.Channel, generationOptions, interceptors));
        }