代码之家  ›  专栏  ›  技术社区  ›  Mark Coleman

存储库和服务设计问题

  •  3
  • Mark Coleman  · 技术社区  · 16 年前

    我们正在尝试找出使用DDD时的最佳实践,我们正在讨论什么是最有意义的或“正确的方法”。

    注意:所有代码都是伪代码。

    让步如下:

    public interface IDomainEntityAService
    {
        void CreateMyObject(DomainEntityA myobject);
        DomainEntityA RetrieveDomainEntityA(long someId);
        //Other operations that handle the business logic dealing with MyObject
    }
    

    我们还有另一个服务,它使用IDomainEntityA服务的一部分来促进专门的需求。

    public interface IDomainEntityBService
    {
        DomainEntityB GetDomainEntityB();
    }
    

    如果其他信息包含以下内容:

    public class DomainEntityB
    {
        public string Name { get; set; }
        public IList<DomainEntityA> DomainEntityAList { get; set; }
    }
    

    现在我们的问题来了。我们正在研究使用存储库来保存其他信息,如:

    public interface IDomainEntityBRepository
    {
        void Add(DomainEntityB information);
        DomainEntityB Get(long someId);
    }
    

    因为我们希望尽可能保持干燥,所以理想情况下我们希望重用IDomainEntityAsService的逻辑来检索DomainEntityB的DomainEntityList列表。哪一个最有意义?

    a)在IDomainEntityBrepositive中引用IDomainEntityA服务 例如

    public class SqlDomainEntityBRepository : IDomainEntityBRepository
    {
    
        public SqlDomainEntityBRepository(IDomainEntityAService domainEntityAService, Database database)
        {
    
        }
    
        public void Add(DomainEntityB information)
        {
            //save DomainEntityB to SQL
        }
        public DomainEntityB Get(long someId)
        {
            //Get OtherInformation.Name from SQL
            //use domainEntityAService.Get() to populate the list of DomainEntityAList
            //return DomainEntityB
        }
    }
    

    b)IDomainEntityBRepository只处理SQL内容,我们使用用于保存其他信息的服务层来填充MyObjects列表。

    public class DomainEntityBService : IDomainEntityBService
    {
        public DomainEntityBService(IDomainEntityAService domainEntityAService, IDomainEntityBRepository repo)
        {
        }
        public DomainEntityB GetDomainEntityB()
        {
            var domainEntityB = _repo.Get(someId);
            domainEntityB.DomainEntityAList = _domainEntityAService.GetAll(someId);
            return domainEntityB;
        }
    }
    

    c)我们为其他信息创建一个特定的DAL对象,并使用服务层来组成其他信息的实例。

    public class DomainEntityBDAL
    {
        public string Name { get; set; }
        public IList<int> DomainEntityAListIds { get; set; }
    }
    

    然后我们将有一个存储库来检索其他信息,然后代码将如下所示:

    public class DomainEntityBService : IDomainEntityBService
    {
    
        public DomainEntityBService(IDomainEntityAService domainEntityAService, IDomainEntityBRepository repo)
        {
        }
        public DomainEntityB GetDomainEntityB()
        {
    
            var domainEntityBDAL = _repo.Get(someId);
            DomainEntityB result = new DomainEntityB() { Name = domainEntityBDAL.Name };
            foreach (var id in domainEntityBDAL.DomainEntityAListIds)
            {
                result.DomainEntityAList.Add(_domainEntityAService.Get(id));
            }
            return result;
        }
    }
    

    d)哇,我们完全是基地外的人,做这个吧!!!!

    我希望这是有道理的,谢谢你的帮助。

    编辑注释:

    也许英文描述可以更好地描述我的问题。我们有一个聚合根的DomainEntityA。有一个对应的服务来处理所有处理DomainEntityA的逻辑。

    现在我们还有一个域名entityb,它是一个聚合根。但是,DomainEntityB有一个DomainEntityA列表。DomainEntityA可以独立生活,但是没有DomainEntityA的列表,DomainEntityB不能生活。

    我们如何加载DomainEntityB中的DomainEntityA项列表并维护DomainEntityA的所有逻辑。

    在域实体服务中重用域实体服务?
    在域实体服务中创建单独的域实体实体实体?

    我们目前使用entlib,但更多的是关于设计的信息,而不是DAL实现。

    2 回复  |  直到 16 年前
        1
  •  0
  •   James Jones    16 年前

    public interface IRepository<T>
    {
        T Get(object id);
        void Save(T value);
        void Update(T value);
        void Delete(T value);
        IList<T> GetAll();
    }
    

    this topic

        2
  •  0
  •   jonnii    16 年前

    C B