2011-10-24 14 views
0

私はワークフロー階層用のストレージソリューションを作成しています。データコンテナ対行動と結合したオブジェクト

画像を単純化するために、ワークフローとワークフローステップの2種類のオブジェクトがあります。

WorkflowStepはワークフローの下に階層的に配置されていますが、これらのオブジェクトはデータコンテナとしてのみ表示されるため、WorkflowStepは集計されません。

だから、これは以下のクラスで私の葉:ワークフロー内WorkflowStepを集約ないため

public class Workflow : Node { 
    public string UID; 
    public string parentID; 
} 

public class WorkflowStep : Node { 
    public string UID; 
    public string parentID; 
} 

public class WorkflowEngine { 
    public void Store(Workflow wf) { 
    } 

    public void Store(WorkflowStep wfs) { 
    } 
} 

推理(論理的にそれが収まるにもかかわらず)これらのオブジェクトは純粋にデータコンテナとして表示され、それらが対象であってもよいことです後で変更する必要があり、これらのオブジェクトの記憶域をオブジェクト自体から切り離して保持したいと考えています。

もちろん他の代替は、このような何かを行うには、次のようになります。

public class Workflow : Node { 
    public List<WorkflowStep> steps; 
    public string UID; 
    public string parentUID; 

    public void Store() { } 
} 

public class WorkflowStep : Node { 
    public string UID; 
    public string parentID; 

    public void Store() { } 
} 

のいずれかのアプローチの長所と短所は何ですか?両方のデザインについて話している文献はありますか?

+0

実際には、データがどのように操作され、どのように物事が全体の大きな画像に収まるかによって異なります – Ankur

答えて

1

WorkflowWorkflowStepは両方ともデータコンテナですが、階層的な措置とは別にこれらを保持しても、デカップリングの問題は解決しません。

Workflowの階層にWorkflowStepを保存し、デカップリングに合わせるには、IoCを導入する必要があります。

IoCの美しさは、あなただけのIoCコンテナであなたのタイプを登録するために考慮される場所WorkflowクラスのリストですWorkflowStepの定義を変更するだけで透明になるということです。

NinjectIoCコンテナフレームワークを使用して例を挙げておきます。

のインタフェースを定義し、それに応じてデータコンテナを実装します。

public interface IWorkflow { 
    string UID { get; set; }  
    string parentID { get; set; } 
    IList<IWorkflowStep> Steps { get; set; } 
} 

public interface IWorkflowStep { 
    string UID { get; set; }  
    string parentID { get; set; } 
} 

public class Workflow : IWorkflow, Node { 

    public string UID { get; set; }; 
    public string parentID { get; set; }; 
    public IList<IWorkflowStep> Steps { get; set; } 
} 

public class WorkflowStep : IWorkflowStep, Node { 
    public string UID { get; set; }; 
    public string parentID { get; set; }; 
} 

をそして今、Ninjectモジュールがあること:

public class WorkflowModule : NinjectModule 
{ 
    #region Overrides of NinjectModule 

    public override void Load() 
    { 
     Bind<IWorkflow>().To<Workflow>(); 
     Bind<IWorkflowStep>().To<WorkflowStep>(); 
     Bind<IList>().To<List>(); 
    } 

    #endregion 
} 

これは、あなたが具体的なクラスを使用して、インターフェースをバインドする単一の場所です。そして、世界の残りの部分では、定義されたインタフェースのインスタンスを要求するだけです。

あなたのタイプを解決するために、あなたはIKernelタイプと定義されてモジュールをロードすることにより、StandardKernelの具体的な実装であるNinject Kernelを作成する必要があります。何かが似ている

、今

var kernel = new StandardKernel(new WorkflowModule()); 

は、すべてあなたがしなければならないようなご希望のインターフェース、解決されていますが、あなたが心配する必要はありませんここに

IWorkflow workflow = kernel.Get<IWorkflow>(); 
IWorkflowStep workflowStep = kernel.Get<IWorkflowStep>(); 

美しさをあなたの具体的な実装については、あなたのシステム内で非常に密接に結合されています。あなたが扱うインターフェイスだけがIoCコンテナの実装の心配です。

WorkflowStepの実装が変更され、Workflowと連結されないことが心配されているので、私は、これはIoCが出場するところです。

は、私はそれに慣れていますので、私はNinjectを使用し、あなたがユニティSpring.NETのStructureMapおよびなどのような任意のIoCコンテナフレームワークを使用することができることに留意されてください。

関連する問題