WCF и введение зависимости через Castle.Windsor - PullRequest
0 голосов
/ 25 августа 2011

Я использую Castle.Windsor в качестве контейнера IoC и пытался зарегистрировать зависимости, аналогичные описанным здесь: http://blog.ploeh.dk/CommentView,guid,f1a71969-0584-4a15-9395-9f2ac65f104b.aspx#commentstart Я написал следующий код:

   public class RiverdaleServiceHostfactory : DefaultServiceHostFactory
    {
        public RiverdaleServiceHostfactory()
            : base(CreateKernel())
        {
        }
        private static IKernel CreateKernel()
        {
            InversionOfControl.RegisterAll();
            InversionOfControl.Container.AddFacility<WcfFacility>();
            return InversionOfControl.Container.Kernel;
        }
    }

Это дает мнеошибка в datacontracts Не удалось найти имя контракта 'Riverdale.Api.DataContracts.CustomerInfoType' в списке контрактов, реализованных сервисом CustomerSearchService. Я проверил атрибуты, конфиги, все настроено кактак должно быть.Похоже, что библиотека с тех пор поменялась, и знаю, что это не тот путь.

Более того, я скачал версию WCF 3.0, и там демонстрация не работает.мой компьютер локально говорит:

Не удалось загрузить тип 'Castle.Facilities.WcfIntegration.Demo.Global'.

Как лучше всего это делать?Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 30 декабря 2011
new WindsorContainer()
                .AddFacility<WcfFacility>()
                .Register(
                    Component.For<IServiceBehavior>().Instance(metadata),
                    Component.For<IServiceBehavior>().Instance(debug),
                    Component
                        .For<IService1>()
                        .ImplementedBy<Service1>()
                        .Interceptors(Castle.Core.InterceptorReference.ForType<ServiceInterceptor>()).Anywhere
                        .Named("service1")
                        .LifeStyle.Transient
                        .AsWcfService(new DefaultServiceModel().Hosted()
                            .AddEndpoints(
                                WcfEndpoint.BoundTo(new BasicHttpBinding()),
                                WcfEndpoint.BoundTo(new WSHttpBinding(SecurityMode.None)).At("ws")
                                ))


                );
        }

Файл Service1.svc

<%@ ServiceHost Language="C#" Debug="true"  Service="service1" 
 Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory,
 Castle.Facilities.WcfIntegration"  %>
0 голосов
/ 26 августа 2011

Проблема с образцом from была в мусоре с конфигурацией bin / output. Чтобы сделать это с помощью библиотеки 3.0 средства WCF Castle Windsor, нужно написать следующий код в Global.asax:

using System;
using System.ServiceModel.Description;
using Castle.Facilities.WcfIntegration;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Castle.Windsor.Installer;


namespace Riverdale.Web
{
    public class Global : System.Web.HttpApplication
    {
        private static IWindsorContainer _container;
        protected void Application_Start(object sender, EventArgs e)
        {
            var returnFaults = new ServiceDebugBehavior
                                   {
                                       IncludeExceptionDetailInFaults = true,
                                       HttpHelpPageEnabled = true
                                   };

            var metadata = new ServiceMetadataBehavior { HttpGetEnabled = true };

            InversionOfControl.RegisterAll();
            InversionOfControl.Container
                .AddFacility<WcfFacility>()
                .Install(Configuration.FromXmlFile("SearchCustomerWindsorConfig.xml"))
                .Register(
                    Component.For<IServiceBehavior>().Instance(returnFaults),
                    Component.For<IServiceBehavior>().Instance(metadata));
            _container = InversionOfControl.Container;
        }

        protected void Application_End(object sender, EventArgs e)
        {
            if (_container != null)
            {
                _container.Dispose();
            }
        }
    }
}

А конфигурационный xml-файл должен содержать что-то вроде:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <components>
    <component id="CustomerSearchService"
                   service="Riverdale.Api.ICustomerSearchService, Riverdale.Api"
                   type="Riverdale.Api.CustomerSearchService, Riverdale.Api">
    </component>
  </components>
</configuration>
...