2

私のソリューションでは、このような 3 つのプロジェクトがあります。 ここに画像の説明を入力

Common.dll と Service.dll を d:\libs のようなフォルダーにコピーし、タイプ scan で以下のコードを使用します。

 ObjectFactory.Initialize(x =>
           {
              x.Scan(xx =>
               {
                   xx.AssembliesFromPath(@"d:\libs");
                   xx.LookForRegistries();
               });
           });
//I have PersonService that implement IPersonService
namespace Common
{
    public interface IPersonService
    {
        string SayHello(string name);
    }
}
namespace Services
{
    public class PersonService : IPersonService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello {0}", name);
        }
    }
}

IPerson からインスタンスを取得するときに依存関係を初期化した後、このエラーが発生します

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

{"デフォルトのインスタンスが登録されておらず、タイプ 'Common.IPersonService' に対して自動的に決定できません\r\n\r\nCommon.IPersonService の構成が指定されていません\r\n\r\n1.) Container.GetInstance(Common .IPersonService)\r\n"}

4

3 に答える 3

2
  • 同様に追加xx.WithDefaultConventions();します。
  • また、StructureMap を使用してプラグイン システムを設計している場合、ホスト プロジェクトはプラグインへの参照を持たないようにする必要があります。d:\libsインターフェイス/コントラクト プラグインのみを参照する必要があり、このアセンブリはフォルダーにコピーしないでください。つまり、現在のアプリケーション ドメインには、アセンブリの 2 つのインスタンスが含まれていてはなりません。したがってIPersonService、ホスト プログラムでインターフェイスを直接使用する場合は、参照を追加し、重複を避けるためにフォルダにCommon.dllコピーしないでください。d:\libsそして今、ホスト プロジェクトも参照を持ってはいけませServices.dllん。
于 2014-12-19T20:25:53.223 に答える
1

内部で を使用するWithDefaultConventions()への呼び出しで を使用できます。ScanDefaultConventionScanner

ソースコードを読むか、ドキュメントを見ることができますが、これは次のことを行います。

var interfaceName = "I" + concreteType.Name;
return concreteType.GetInterfaces().FirstOrDefault(t => t.Name == interfaceName);

デフォルトの規約スキャン中に、スキャンされた各具象型は、文字「I」が前に付いたクラス名の最初のインターフェースを探します。そのため、スキャン中に が見つかったIFooService場合FooServiceは自動的に登録および割り当てられるため、明示的に指定する必要がありません。

For<IFooService>().Use<FooService>()

要求した型の具体的な実装が登録されていない場合、表示されている例外は常にスローされます。

于 2014-12-19T20:54:17.723 に答える
0

StructureMap レジストリを検索するxx.LookForRegistries()でスキャンしているため、登録されると予想されるタイプではありません(レジストリの詳細については、こちらを参照してください - http://structuremap.github.io/registration/registry-dsl/ ) 。 . 適切な登録でそのようなレジストリを作成すると、SM はそれらを見つけて登録します。

すでに述べたように、代替手段はxx.WithDefaultConventions()を使用することです。デフォルトの規則を使用している場合、予想されるタイプが登録されていない場合、このエッジケースを見てください - https://stackoverflow.com/a/27449018/4336786

于 2014-12-21T15:19:51.650 に答える