これはスレッドへのフォローアップの質問です:親/子クラスを構造マップでコンストラクターパラメーターとして渡す方法は?
ありがとうPHeiberg。本当に助かります。さらに2つの質問があります:
そこに PricingHandlerFactory コンストラクターが必要なのはなぜですか?
私がイライラするのは、実際に 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 });
}