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

并且在repository的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.NewGuid()。如果您确实希望表完成这项工作,尽管您可以在您的对象中使其为空,并将表中列的默认值设置为 newid()。

于 2012-11-07T20:20:32.563 回答