0

これはスレッドへのフォローアップの質問です:親/子クラスを構造マップでコンストラクターパラメーターとして渡す方法は?

ありがとうPHeiberg。本当に助かります。さらに2つの質問があります:

  1. そこに PricingHandlerFactory コンストラクターが必要なのはなぜですか?

  2. 私がイライラするのは、実際に PricingHandler が直接呼び出されないことです。リフレクションとレジストリを使用して PricingHandler を見つけています。ie(すべてのコードが貼り付けられているわけではありません。)

public class MessageHandlerRegistry : Registry
{
    public MessageHandlerRegistry()
    {
        Scan(x =>
        {
            x.AssemblyContainingType(typeof(PricingHandler));
            x.ConnectImplementationsToTypesClosing(typeof(IMessageHandler<>));
        });
    }
}

private object QueryHandlerExecute(IMessage message)
{
    var handlerType = typeof(IMessageHandler<>);
    var genericType = handlerType.MakeGenericType(message.GetType());
    var messageHandler = ObjectFactory.GetInstance(genericType);
    return messageHandler.GetType().GetMethod("Execute")
        .Invoke(messageHandler, new object[] { message });
}

の実際の宣言PricingHandlerは次のとおりです。

public class PricingHandler : IMessageHandler<PricingMessage>
{
    public PricingHandler(IPricingFactorsRepository pricingFactorsRepository)
    public object Execute(PricingMessage pricingMsg){}
}

簡単に言えば、 で見つけPricingHandlerますIMessageHandler<PricingMessage>。だから私たちは使えない

ObjectFactory.GetInstance<PricingHandler>(); 

PricingHandler を見つけて、コンストラクタ パラメータのタイプを設定します。

では、そのような場合、コンストラクターのパラメーターの型をどのように設定できますか?

編集1.

今のところ、「FACTORY」クラスを更新して、名前付きインスタンス (pricinghandler.) を指定できるようにしています。

private object QueryHandlerExecute(IMessage message,string instanceName)
        {
            var handlerType = typeof(IMessageHandler<>);
            var genericType = handlerType.MakeGenericType(message.GetType());
            var messageHandler = string.IsNullOrEmpty(instanceName)
                                     ? ObjectFactory.GetInstance(genericType)
                                     : ObjectFactory.GetNamedInstance(genericType, instanceName);
            return messageHandler.GetType().GetMethod("Execute").Invoke(messageHandler, new object[] { message });
        }
4

0 に答える 0