0

私はautofacで作業しています。これまでのところ、すべての依存関係をコンストラクター インジェクションで解決しています。

私が立ち往生する場合があります:

特定の顧客クラスを考慮すると、次のようになります。

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();
    }
}

リクエストまたは GUI アクションに基づいて新しい顧客オブジェクトを作成するため。新しいオペレーターを使用します。ただし、挿入したい 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;
            });

私の質問は次のとおりです:どうすれば、Customer に ExternalIdProvider の動作を挿入できますか? (autofac を使用)

この記事では、サービス ロケーターを使用してこれを行う方法のサンプルを示します: http://blogs.msdn.com/b/simonince/archive/2008/06/30/dependency-injection-is-dead.aspx

ご協力いただきありがとうございます。

4

1 に答える 1

0

エンティティに対する動作を再検討する必要があります。エンティティに動作があると、エンティティに依存性注入を行う必要があり、これは厄介な状況につながります。この関連する SO の質問と Mark Seemann の素晴らしい回答 をご覧ください。

したがって、クラスでこれらの操作を行う代わりに、それらをリポジトリCustomerクラスに移動します。注目すべき他のパターンは、作業単位コマンド、およびクエリです

于 2012-04-07T09:25:58.157 に答える