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プロジェクトが提供するもの(Castle.Facilities.WcfIntegration.DefaultServiceHostFactory)を継承する独自のサービスホストファクトリを作成し、ファクトリのコンストラクタでウィンザーコンテナを作成できます。

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 に答える