2

我阅读了很多关于自动增量 ID(guid、interlocked.increment、ObjectIdGenerator ...)的内容,但没有找到适合我的情况。

在我的域模型中,用户要求为他们创建的每个 Activity 设置一个自动渐进式数字 ID。

由于这是一个用户请求,我想把它放在我的域模型中,但是我通常在没有良好架构的旧应用程序中这样做的模式是访问数据库,检索最大值并添加 1;所以我不能在我的对象中做到这一点,因为域层一定不知道 db。

不喜欢 db 身份因为缺乏控制(有时 db 管理员必须在创建活动时更改用户错误的 id)。

interlocked.increment 看起来不错,但我的应用程序安装在每台用户机器上,所以我无法使用它

因为它必须是可理解的和进步的,所以我不能使用 guid

我在 Lev Gorodinski 关于域驱动设计中的服务域的文章中找到了一个好主意:将域层中 GenerateActivityId 的接口定义为域服务,但我没有找到一种方法来很好地实现它。

有什么建议吗?

编辑:列夫戈罗丁斯基的想法:

public class Activity {
  public int Id {get; private set;}
  public string Description {get;set;}

  public Activity (string description){
    this.Description = description 
    this.Id = generator.GenerateId()
  }
}

public interface IIdGenerator{
  int GenerateId()
}

但我没有看到“生成器”在哪里定义,也没有找到 IIdGenerator 实现:我应该把实现放在哪里?在 ActivityRepository 中?如果是,我可以省略 IActiviryRepositoryInteface 的 IIdGenerator 吗?

4

1 回答 1

1

我的想法:

领域层

public class Activity {
  public int Id {get; private set;}
  public string Description {get;set;}

  public Activity (string description){
    this.Description = description 
    var activityRepository = kernel.Get<IActivityRepository>();
    this.Id = activityRepository .GetMaxId() + 1 
  }
}

public interface IActivityRepository{
  public int GetMaxId();
}

数据访问层

public class ActivityRepository
{
    pulic int GetMaxId()
    {
      // query for retriving max id from table
    }
}

某处(在哪里?)我用 Ninject 定义依赖注入

var kernel = new StandardKernel();
kernel.Bind<IActivityRepository>().To<ActivityRepository>();
于 2013-09-16T08:45:45.427 回答