0

3層の単純なmvcアプリケーションがあります

  1. Ui => Common And Services への参照があります
  2. 一般
  3. Services => Common への参照があります

共通レイヤーでサービス コントラクトを定義し、それをサービス レイヤーで実装します

//Common layer
public interface IPersonService
{
  void Foo();
}
//Services layer
public classPersonService:IPersonService
{
  void Foo()
  {
    //To DO
  }
}

私の Global.asax では、最初の Structuremap コンテナー用にこのコードを記述します。

 ObjectFactory.Initialize(x =>
        {
            x.Scan(scan =>
            {
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();
            });
        }

今、私のコントローラーで、このように IPersonService からインスタンスを取得したいとき

var personService= ObjectFactory.GetInstance<IPersonService>();

このエラーが発生します

デフォルトのインスタンスは登録されておらず、タイプ '*.IPersonService' に対して自動的に決定できません

この問題を解決するためのアイデアはありますか?

4

1 に答える 1

1

AssembliesFromApplicationBaseDirectory()次のように、関数を使用してスキャンする他のアセンブリを指定できます。

scan.AssembliesFromApplicationBaseDirectory(a => a.FullName.StartsWith("YourNamespace.Common"));
scan.AssembliesFromApplicationBaseDirectory(a => a.FullName.StartsWith("YourNamespace.Services"));

この質問に StructureMap 3 の質問としてタグを付けたのを見て、 Jeremy Miller (StructureMap の作成者) が将来のバージョンで削除されるObjectFactoryことを明確にしたため、 を使用しないことをお勧めします。実際、将来のバージョンで削除されるという警告が表示されるはずです。

代わりに、コンテナを次のように構成することを目指す必要があります。

IContainer container = new Container();
container.Configure(c => {
    c.IncludeRegistry<YourRegistry>();
});

DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));

StructureMap のレジストリの詳細については、こちらを参照してください。

于 2015-01-28T13:09:58.597 に答える