1

WindsorCastleDIコンテナが提供するTypedFactoryを使用しています。私はDIコンテナーにまったく慣れていないので、私のソリューションについて少しガイダンスを求めています。

これが私の実装です:

*更新された登録とDB呼び出し

public interface IAgent {    }
public class Agent : IAgent     {    }

public interface IAgentFactory     
{
    IAgent Create();
    IAgent Create(int agentId);
    IAgent Create(AgentDTO agentDTO);
}

class AgentFactory : IAgentFactory     
{        
    public IAgent Create()         
    {            
        return InitNewEntity(new Agent());
    }
    public IAgent Create(int agentId, IDBContext dbContext) //Not happy with this, as it's a dependency that isn't factored out :(    
    {
        return dbContext.GetAgent(agentId);
    }
    public IAgent Create(AgentDTO agentDTO)
    {
         Agent agent = InitNewEntity(new Agent());
         agent.ParseDTO(agentDTO);
         return agent;
    }
    private IAgent InitNewEntity(IAgent agent)
    {
         agent.Username = "";        /// + other fields to initialise
         agent.DOB = DateTime.Now;   /// etc.
         return agent;
    }

..。

Container.AddFacility<TypedFactoryFacility>()
            .Register( Component.For<IAgentFactory>()
                                .ImplementedBy<AgentFactory>());

いくつかのエンティティを取得するために次の呼び出しを使用しています

IAgentFactory agentFactory = ViewModel.Container.Resolve<IAgentFactory>();

IAgent agent = agentFactory.Create();  //Creates new Agent entity
agent = agentFactory.Create(66, dbContext); //Looks up entity in database, don't like passing in a db context, another dependency
agent = agentFactory.Create(agentDTO);      //Creates Agent entity from DTO object

私はこれについていくつかの懸念があります。

新しいエージェントの作成に関して考えられるシナリオは3つあります。

1:新しいエージェントを最初から作成する

2:既存のDTO(データ転送オブジェクト)を使用してエージェントを作成します

3:データベースへの呼び出しを使用してエージェントを作成します。

法案に適合しているように見えるので、このすべての機能を工場に導入することにしましたが、これがこれを達成するための正しい方法であるか、最善の方法であるかは完全にはわかりません。

問題は、3つのCreateシナリオすべてをDIコンテナのRegisterステートメントに活用し、具体的なファクトリ実装を完全に省略して、AgentFactoryクラスではなく、IAgentFactoryインターフェイスのみを使用できるかどうかです。

この実装に関して私が持っているもう1つの質問は、エージェントエンティティを要求した場合、参照せずにエンティティを作成するのではなく、最初にファクトリに呼び出しを行い、ファクトリから作成されたエンティティを返すように、呼び出しを行うことができることです。工場。すなわち。

IAgent agent = Container.Resolve<IAgent>(66);

コールスタックの場合:

Container-> AgentFactory-> Create(66)->ファクトリからエージェントを返します。

どのウィンザーがインターセプトし、ファクトリを自動的に使用してインスタンスを作成します。しかし、私はこれを試しましたが、ファクトリを使用して作成するのではなく、ファクトリを参照せずに先に進んでエージェントを作成しました。

私はこれを持っていましたが、私が定義したファクトリメソッドを呼び出しません。

Container.AddFacility<TypedFactoryFacility>()
            .Register(Component.For<IAgentFactory>().AsFactory(),
                      Component.For<IAgent>().ImplementedBy<Agent>());

アドバイスをいただければ幸いです、ありがとうございます。

4

1 に答える 1

2

型付きファクトリは、「データ」インスタンスではなく、「動作」インスタンスを作成するように設計されています。

「モデル」コンポーネントをコンテナに登録するのではなく、モデルを使用して機能するようにします。つまり、モデル以外のすべてをコンテナーに登録します。

AgentFactory をコンテナーに登録する必要がありますが、それは「型付きファクトリー」ではありません。「遅い依存関係」の目的でTFを使用できます。

私は自分のデザインとより分離し、より「単一の責任」を重視することを好みます。AgentFactory は、(Create from db に従って) ファクトリ内のリポジトリを非表示にしません。代わりに、Create パラメータとして datareader を渡します。

于 2012-07-02T10:58:24.327 に答える