1

次のコードがあります。

public class Dispatcher : IDispatcher {
  public void Send(Order order) {
    var type = typeof(IOrderHandler<>).MakeGenericType(order.GetType());
    var handler = ObjectFactory.GetInstance(type);
  }
}

注:この場合の順序が次の IOrderHandler を取得しようとしています: public class CoffeOrder : Order { }

私のStructureMap構成は次のとおりです。

ObjectFactory.Initialize(x => {
  x.For<IOrderHandler>().Use<OrderHandler>();
});

デバッグすると、次のエラーが表示されます: {"StructureMap 構成エラー:\r\nエラー: 104\r\nソース: レジストリ: StructureMap.Configuration.DSL.Registry, StructureMap, Version=2.6.4.0, ...

他のオプションを試してみましたが、常に 104 エラーまたは 202 エラーで終わります: "StructureMap Exception Code: 202\nNo Default Instance defined for PluginFamily Proj.Test.Tests+IOrderHandler`1[[Proj.Test.Tests+CoffeOrder,プロジェクトテスト、...

注: CoffeOrder は、テストで渡す注文のタイプです。

Handler クラスとインターフェイスの私のコードは次のとおりです。

public class CoffeHandler : OrderHandler<CoffeOrder> {
  public override void Handle(CoffeOrder order) {
    // Some Code
  } // CoffeHandler
} 

public interface IOrderHandler {
  void Handle(Order order);
} // IOrderHandler

public interface IOrderHandler<TOrder> : IOrderHandler where TOrder : Order {
  void Handle(TOrder order);
} // IOrderHandler

public abstract class OrderHandler : IOrderHandler {
  public abstract void Handle(Order order);
} // OrderHandler

public abstract class OrderHandler<TOrder> : OrderHandler, IOrderHandler<TOrder> where TOrder : Order {

  public override void Handle(Order order) {
    TOrder torder = (TOrder)order;
    Handle(torder);
  } // Handle

  public abstract void Handle(TOrder order);

} // OrderHandler

誰か助けてくれませんか?

ありがとう、ミゲル

4

1 に答える 1

3

解決時ではなく、登録時にすぐに失敗することに注意してください。あなたの登録は次のように述べています:「型のクラスIOrderHandlerが要求されたとき、具体的なインスタンスを返しますOrderHandler

OrderHandlerは抽象クラスであるため、StructureMap はその具体的なインスタンスを作成できません。以下のように登録すると、

ObjectFactory.Initialize(
            x => x.For<IOrderHandler<CoffeOrder>>().Use<CoffeHandler>());

あなたは、「タイプのクラスが要求されたときIOrderHandler<CoffeOrder>(これはあなたの例で要求しているものです)、 の具体的なインスタンスを返しますCoffeHandler。これは、 をインスタンス化できるため、有効なマッピングですCoffeHandler

上記で問題に対処しましたが、登録したいさまざまな実装がたくさんある場合は、StructureMap にもっと足を運んでもらいたいと思うかもしれません。その場合は、StructureMap が Open Generics をサポートしているため、幸運です。

次に、解決コードは次のようになります。

var handler = ObjectFactory.ForGenericType(typeof(IOrderHandler<>))
             .WithParameters(order.GetType())
             .GetInstanceAs<IOrderHandler>();

の具体的な汎用実装があるIOrderHandler<>場合は、それを登録するだけです。しかし、あなたはそうではなく、[私の推測では]すべての具体的なインスタンスを登録したくないので、スキャンを行う必要があります. それを行う方法は、実際には別の質問であり、何をスキャンしたいのかを知らずに答えることはできません. ただし、スキャンをカバーするサンプルを含む構造マップのオープン ジェネリックを詳述したブログ投稿については、こちらを参照してください。

于 2012-09-14T02:07:07.877 に答える