2

プラグインスタイルのシステムでStructureMapのプロパティインジェクションを使用しようとしています。

ObjectFactory.Initialize(o => o.Scan(s =>
{
    s.AssembliesFromPath("path_to_assemblies");
    s.WithDefaultConventions();
});

これがサンプル実装です(TとTUは単なる単純なクラスであるため、意図的に定義することはしませんでした)

public interface IBarService
{
    void Baz();
}

public class BarService : IBarService
{
    public void Baz() { /* implementation */ }
}


public abstract class PluginBase<T, TU> : IPlugin
    where T : AClass, new()
    where TU : BClass
{
     protected PluginBase()
     {
         //some init code in the constructor
     }
}

//Foo is created at run-time via Activator.CreateInstance()
public class FooPlugin : PluginBase<AClass, BClass>
{
   [SetterProperty]
   public IBarService BarService { get; set; }

   public void Fooey()
   {
       BarService.Baz();
   }
}

実行時に作成されるこれらすべてのプラグインのプロパティの依存関係を自動配線したいと思います。プロパティインジェクションから始めて、必要に応じてコンストラクターに移動すると思いました。

私が行った場合:

var obj = ObjectFactory.GetInstance<IBarService>();

のインスタンスのどこでもFooPlugin、正しい実装が得られ、すべてが順調です。

私が行った場合:

this.BarService.Baz();

のインスタンスが設定されていないため、null参照例外が発生しますIBarService

プラグインを作成した後、これを行うと:

ObjectFactory.BuildUp(pluginObject)

すべてが順調でFooPlugin、の正しい実装がありIBarServiceます。

プラグインのプロパティを簡単に装飾して、プラグ[SetterProperty]インの作成時にStructureMapに自動的に挿入させる方法はありますObjectFactory.BuildUp(pluginObject)か?

4

2 に答える 2

1

プラグインインスタンスが機能しない場合、どのようにプラグインインスタンスを作成していますか?あなたはただやっていnew FooPlugin()ますか?

var plugin =ObjectFactory.GetInstance<PluginBase<AClass, BClass>>();を実行すると、すべての正しい依存関係が解決されたプラグインを取得できますか?

「new」を使用してオブジェクトをインスタンス化している場合、コンテナは、インスタンスが依存関係を解決する必要があることを知る方法がありません。そのインスタンスについての知識はありません。依存性の注入が必要なインスタンスは、いわば「コンテナによって管理」される必要があります。

于 2012-12-28T20:21:33.133 に答える
0

反対のルートをたどり、すべての依存関係をコンストラクターに注入すると、多くの問題を回避できます。このように、オブジェクトが適切に初期化されているかどうかを確認する必要がある単一の場所があります...

于 2012-12-28T20:12:24.743 に答える