9

テストデータを作成するために、次のBuilderパターンのバリエーションを使用します(簡略化された例です!)。

サンプルクラス:

public class Person
{
   public string Name { get; set; }
   public string Country { get; set; }
}

ビルダー:

public class PersonBuilder
{
    private string name;
    private string country;

    public PersonBuilder()
    {
        SetDefaultValues();
    }

    private void SetDefaultValues()
    {
        name = "TODO";
        country = "TODO";
    }

    public Person Build()
    {
        return new Person
                   {
                       Name = name,
                       Country = country
                   };
    }

    public PersonBuilder WithName(string  name)
    {
        this.name = name;            
        return this;
    }

    public PersonBuilder WithCountry(string country)
    {
        this.country = country;
        return this;
    }
}

注:例自体のコンテキストは関係ありません。ここで重要なのは、この例では、PersonBuilderのようなビルダークラスをエンティティクラス(Person)を見て、同じパターンを適用することで完全に生成できることです。以下を参照してください。

ここで、personクラスに2ではなく15のプロパティがあると想像してください。ビルダークラスを実装するには多少の手間がかかりますが、理論的には、Personクラスから自動的に生成できます。コード生成を使用してビルダークラスをすばやく設定し、必要に応じて後でカスタムコードを追加できます。

コード生成プロセスはコンテキスト(personクラスの名前とプロパティ)を認識している必要があるため、単純なテキストベースのコード生成や正規表現の魔法はここでは感じられません。テキストベースではなく動的であり、VisualStudio内からすばやくトリガーできるソリューションが推奨されます。

このようなシナリオでコード生成を実行するための最良の方法を探しています。反射?コードスミス?T4テンプレート?マクロを使用したResharperLiveテンプレート?

私はいくつかの素晴らしい答えを見るのを楽しみにしています:)

4

4 に答える 4

2

CodeSmith Generator 5.xに、既存のコードから生成できる機能を追加しました。こちらのドキュメントをご覧ください。また、CodeSmith Generator テンプレートでリフレクションまたは任意の .NET ライブラリを使用できます。

ありがとう -Blake Niemyjski

于 2011-03-23T16:26:48.737 に答える
2

T4 ソリューションは、Visual Studio によく統合されたオプションです。T4 テンプレート内でリフレクションを使用して、実際にコードを生成できます。

于 2011-03-22T14:12:09.877 に答える
0

テスト専用の場合は、RhinoMocksのようなモックフレームワークを検討してください。

internal class PersonBuilder
{
    private MockRepository _mockRepository;
    private IPerson _person;

    public PersonBuilder()
    {
        _mockRepository = new MockRepository();
        _person = _mockRepository.Stub<IPerson>();
    }

    public PersonBuilder WithName(string name)
    {
        _person.Name = name;
        return this; 
    }

    public PersonBuilder WithCountry(string Country)
    {
        _person.Country= Country;
        return this;
    }

    public IPerson Build()
    {
        _mockRepository.ReplayAll();
        return _person; 
    }

}

このようにして、ビルダーはニーズに合わせて進化することができます。さらに、Buildメソッドを変更する必要はありません。「WithX」メソッドを追加するだけです。

于 2011-03-23T14:11:41.920 に答える
0

ABSEモデリング手法とその IDE であるAtomWeaverを調べてください。ABSE はテンプレート ベースのモデリングおよびコード生成フレームワークであり、モデル (UML や MDA とは関係ありません) は "ビルディング ブロック" (Atom) を適用することによって作成されます。これらの Atom はテンプレートとプログラムのハイブリッドであり、コンテキストを認識します。Atom は、ツリー上の配置と、特定の Atom の有無に応じてコードを生成できます。

モデル ホスト (この場合は AtomWeaver) は、目的のソース コードを取得するためにモデルを「実行」します。モデルを「ソース」にすることができます。モデルを変更し、必要な回数だけ再生成します。

AtomWeaver は Visual Studio に統合されていませんが、Visual Studio と一緒に問題なく動作します。

于 2011-03-24T15:41:46.910 に答える