0

So I've wired up my open generic plugin in StructureMap like so

scan.ConnectImplementationsToTypesClosing(typeof(IRepository<>));

But still get the dreaded

No Default Instance defined for PluginFamily KharaSoft.Utils.IRepository`1[[KharaSoft.App.Core.DomainObject, KharaSoft.App.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]

I debug after the Container is initialized and see that it does indeed have an instance of RepositoryBase<> registered so it knows what I want done, but it won't close it for me. Is there something I'm missing here?

4

2 に答える 2

1

完全なスキャンコードまたはプロジェクトのレイアウトを見ずにトレーニングするのは困難です。この問題が発生したときに通常実行するデフォルトの手順がいくつかあります。

あなたが持っていることを確認してください

scan.WithDefaultConventions()

リポジトリクラスを含むアセンブリがスキャンに含まれていることを確認します。

x.AssemblyContainingType(typeof(UserRepository)); 

正しい実装が行われていることを確認してください。

IRepository<User>

一致する

Repository<User>

うまくいけば、このアドバイスの中に何かが問題を見つけるのに役立つかもしれません。

于 2011-02-28T09:34:35.307 に答える
0

したがって、これが「最良の」方法であるかどうかはわかりませんが、これが機能することがわかりました。次のように、プラグインのオープン実装を明示的に登録する必要がありました。

ObjectFactory.Initialize(
  x =>
    {
      x.Scan(scan =>
        {
          scan.Assembly(typeof (IRepository<>).Assembly);
          scan.WithDefaultConventions();
        });
      x.For(typeof (IRepository<>)).Use(typeof (RepositoryBase<>));
      x.For<IUnitOfWork>().Use<MyDataContext>();
    });
return ObjectFactory.Container;

すべての場合にジェネリックを直接閉じたくなかったのを参照してください。だから今私のMVCコントローラーはそのような依存関係を取ることができます

public PlayerController(IRepository<Player> players)
{
  Players = players;
}

そしてStructureMapはRepositoryBaseのインスタンスで依存関係を閉じます

于 2011-02-28T23:15:31.803 に答える