2012-04-06 12 views
0

私はautofacを使っています。これまではコンストラクタインジェクションのすべての依存関係を解決しています。手動で作成されたオブジェクトに動作を注入します

与えられた顧客クラスを考慮:要求またはGUIのアクションに基づいて、新たな顧客のオブジェクトを作成するために

public class Customer : ICustomer 
{ 
    public string Name { get; set; } 

    private int ExternId { get; set; } 

    public IExternalIdProvider externalIdProvider { get; set; } 

    public Customer() 
    { 
      this.externalIdProvider = new ConcreteIdProvider(this); 
    } 

    public BevorSave() 
    { 
     this.ExternId = externalIdProvider.GetNextId(); 
    } 
} 

は私がはまり込む場合があります。私は新しいオペレータを使用します。しかし、 - 私は私が注入したいCustomerClass内にIdProviderがあります。 (プロパティとして)。

お客様は、私のような設定を使用することになり、IOCコンテナによって解決されるだろう場合:

builder.RegisterType<ConcreteIdProvider>().As<IExternalIdProvider>(); 
builder.RegisterType<Customer>().As<ICustomer>() 
     .OnActivated(ae => 
      { 
       IExternalIdProvider idProvider = 
       ae.Context.Resolve<IExternalIdProvider>(TypedParameter.From(ae.Instance)); 
       ae.Instance.externalIdProvider = idProvider; 
      }); 

、私の質問は:私がお客様にExternalIdProviderの行動を注入することができますどのように?

は、この記事では、サンプルを示し(autofacを使用して)、これはサービスロケータで行われるだろうか。あなたの助けを http://blogs.msdn.com/b/simonince/archive/2008/06/30/dependency-injection-is-dead.aspx

感謝。

+0

[機能しない]コードスニペットを使って何をしようとしているのかを明確にする必要があります。あなたがプロパティを注入したいだけなら、あなたは顧客登録時にAutofacのPropertiesAutowired関数を使うことができますが、私はそれがあなたの後ろではないと推測しています。リンクした例は、アスペクト指向プログラミングのためのPostSharpの使用を示しています。これは、依存関係解決の枠組みではなく、その例の鍵です。 –

答えて

0

エンティティの動作が再考される必要があります。あなたのエンティティで動作することは、それらに依存性の注入を強制することになります。これはあなたがすでに気づいていた厄介な状況につながります。 this related SO question and Mark Seemann's great answerをご覧ください。

したがって、これらの操作をCustomerクラスで実行する代わりに、repositoryクラスに移動します。見るべき他のパターンは、unit of work,commandsおよびqueriesです。

関連する問題