0

私はDDDを学ぼうとしていますが、簡単なデモプロジェクトを作成しています。

今、私は一般的なリポジトリを持っています

public class Repository<T> where T : class, IAggregateRoot
{
    public void Add(T entity)
    {
        ObjectSet.AddObject(entity);
    }
}

Productクラス

public class Product : IAggregateRoot
{
    private Guid _id = Guid.Empty;
    public Guid Id
    {
        get { return _id; }
        private set { _id = value; }
    }
    public string Name { get; private set; }

    protected Product() { }
    public Product(string name)
    {
        Name = name;
    }
}

アイデアは、作成された製品に空のGUIDを持たせたいということです。がデータベースに挿入された場合にのみ、新しいGUIDを取得する必要があります。

Product product = new Product("Hello World");
product.Id == Guid.Empty; // True

現在、リポジトリを呼び出して製品を挿入すると、空のGUIDを使用してデータベースに挿入されます。

var repository = new Repository<Product>();
repository.Add(product);

製品のGUID世代はどこに置くべきですか?リポジトリに?はいの場合、私は汎用リポジトリを持っているので、どのようにすればよいですか。

ありがとうございました

4

2 に答える 2

3

このように、IAggregateRoot定義を変更してIDプロパティを追加できます。

interface IAggregateRoot
{
    Guid Id { get; set;}
}

プロジェクトのすべてのクラスにはIDがあり、IAggregateRootインターフェイスを実装するため、次のように、クラスコンストラクター内でIDを初期化できます。

public class Product : IAggregateRoot
{
    public Guid Id { get; set; }
    public string Name { get; private set; }


    protected Product() { }
    public Product(string name)
    {
        Id = Guid.Empty;
        Name = name;
    }
}

リポジトリのAddメソッド内に、Guid.NewGuid()を配置して、それを転送できます。

public class Repository<T> where T : class, IAggregateRoot
{
    public void Add(T entity)
    {
        entity.Id = Guid.NewGuid();
        ObjectSet.AddObject(entity);
    }
}
于 2012-11-07T20:21:59.980 に答える
1

オブジェクトがGuidを作成するのではなく、データベースにGuidを作成させたい理由はありますか?最も簡単な解決策は、プロパティをGuid.NewGuid()に設定することだと思います。テーブルで実際に作業を実行したい場合は、オブジェクトでnull許容にし、テーブルの列のデフォルト値をnewid()に設定できる場合があります。

于 2012-11-07T20:20:32.563 に答える