0

我继承了一个使用 Castle DI 的项目。我正在向解决方案添加 WCF,并且需要使用解决方案中的一些功能。该类具有以下内容,我假设是注入。

private readonly IOrderRepository _orderRepository;
    private readonly IEshopOrderRepository _eShopOrderRepository;
    private readonly IUserRepository _userRepository;
    private readonly IListRepository _listRepository;
    private readonly INHibernateRepositoryWithTypedId<ProductVariant, string> _productVariantRepository;

    private readonly IMapper<GiftCardPayment, string, GiftCardPaymentDto> _giftCardDtoMapper;
    private readonly IMapper<AbstractOrder, OrderDto> _orderDtoMapper;
    private readonly IMapper<AbstractOrder, RecurringOrder> _recurringOrder;
    private readonly IMapper<Address, CreditCardPaymentDto> _creditCardDtoMapper;

    public delegate OrderDto ShipmentProcessing(OrderDto order, bool isRecap);

    public OrderManagementService(IOrderRepository orderRepository, IUserRepository userRepository, IListRepository listRepository,
        IEshopOrderRepository eShopOrderRepository,
        INHibernateRepositoryWithTypedId<ProductVariant, string> productVariantRepository,
        IMapper<GiftCardPayment, string, GiftCardPaymentDto> giftCardDtoMapper,
                                  IMapper<AbstractOrder, OrderDto> orderDtoMapper,
        IMapper<AbstractOrder, RecurringOrder> recurringOrder,
        IMapper<Address, CreditCardPaymentDto> creditCardDtoMapper)
    {
        _orderRepository = orderRepository;
        _eShopOrderRepository = eShopOrderRepository;
        _userRepository = userRepository;
        _listRepository = listRepository;
        _productVariantRepository = productVariantRepository;
        _giftCardDtoMapper = giftCardDtoMapper;
        _orderDtoMapper = orderDtoMapper;
        _recurringOrder = recurringOrder;
        _creditCardDtoMapper = creditCardDtoMapper;
    }

所有这些都有效。我的问题是如何在 WCF 服务类中实现这种模式。我无法将参数添加到构造函数,因为客户端不会提供它们。

我能够在 WCF 中使用 DI,因此该部分可以正常工作。

谢谢

4

1 回答 1

1

Castle 有一个WCF 设施。本质上,它是一个自定义服务工厂,用于创建您的服务,而不是 WCF 提供的默认工厂。如果你想使用流畅的注册,你必须将你的服务提供给服务主机工厂中使用的容器。为此,您可以创建自己的服务主机工厂,继承自城堡项目提供的服务主机工厂 (Castle.Facilities.WcfIntegration.DefaultServiceHostFactory),并在工厂的构造函数中创建 windsor 容器。

您自己的服务主机工厂的示例实现,派生自 Castle 提供的 DefaultServiceHostFactory:

public class MyOwnServiceHostFactory: Castle.Facilities.WcfIntegration.DefaultServiceHostFactory
{

    public MyOwnServiceHostFactory() : base(CreateKernel())
    { }

    private static Castle.MicroKernel.IKernel CreateKernel()
    {
        var container = new Castle.Windsor.WindsorContainer();
        container.Install(new WindsorInstaller());
        return container.Kernel;
    }

}


public class WindsorInstaller : IWindsorInstaller
{

    #region IWindsorInstaller Members

    public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
    {
        container.AddFacility<Castle.Facilities.WcfIntegration.WcfFacility>();
        container.AddFacility<Castle.Facilities.TypedFactory.TypedFactoryFacility>();

        container.Kernel.Resolver.AddSubResolver(new Castle.MicroKernel.Resolvers.SpecializedResolvers.ListResolver(container.Kernel));
        // add your services here...
    }

}
于 2012-10-04T18:49:45.350 回答