0

私は StructureMap を初めて使用し、他の人が抱えている問題の逆のように見える次の問題を抱えています。UnitOfWorkClass次のように定義されたジェネリックがあります。

public class UnitOfWork<TContext> : IUnitOfWork
    where TContext : IContext, new()
{
    ....
}

ただし、具体的なインスタンスにいくつかの異なる可能性がある場合、これを登録して解決する方法については困惑しています。

私は、人々が次のような一般的なインターフェースを持っている例をたくさん見てきました:

Scan を使用したジェネリック型の StructureMap 自動登録

ですから、自分のデザインも見直す必要があるかどうかという質問をすることができると思います!

どうもありがとう!

# 可能な解決策を編集しますか?

したがって、コンストラクターに2つのパラメーターを受け取るクラスがあります。

public MyClass(IUnitOfWork firstConstructor, 
    IUnitOfWork secondConstructor)
{
    ...
}

次に、オブジェクト グラフが作成されると、次のことを行います。

ObjectFactory.Initialize(cfg =>
{
    var firstContext = cfg.For<IContext>().Use<MyFirstContext>();
    var secondContext = cfg.For<IContext>().Use<MySecondContext>();

    var firstUnitOfWork =
        cfg.For<IUnitOfWork>().Use<UnitOfWork<MyFirstContext>>()
        .Ctor<IContext>().Is(firstContext);

    var secondUnitOfWork =
        cfg.For<IUnitOfWork>().Use<UnitOfWork<MySecondContext>>()
        .Ctor<IContext>().Is(secondContext);

    cfg.For<IMyClass>().Use<MySecondContext>()
        .Ctor<IUnitOfWork>("firstConstructor").Is(firstUnitOfWork)
        .Ctor<IUnitOfWork>("secondConstructor").Is(secondUnitOfWork);
});

だから私がここでやったことは次のとおりです。

  • IContext の依存関係を解決し、それらを変数に格納しました
  • 解決された IContext を IUnitOfWork コンストラクターに挿入しました
  • その後、正しいジェネリック UnitOfWork コンストラクターを正しく解決できます

完璧ではありませんが、これは私のニーズに合っていると思います...

4

1 に答える 1

2

私はあなたが何を望んでいるのか完全にはわかりませんが、IUnitOfWork のようにインターフェイスをジェネリックにした場合は、次のように登録できます。

ObjectFactory.Initialize(x =>
{
    x.For(typeof(IUnitOfWork<>)).Use(typeof(UnitOfWork<>));
}

StructureMap は実装クラスに正しい型を提供します。それはあなたが必要とするものをあなたに与えますか?

于 2013-07-23T12:48:04.503 に答える