我的项目有一个设计问题,我不知道如何解决,我有一个包含存储库的 DAL 层和一个包含“处理器”的服务层。处理器的作用是提供对 DAL 数据的访问并执行一些验证和格式化逻辑。
我的域对象都引用了服务层中的至少一个对象(以从存储库中检索它们的属性值)。但是我面临两个周期性依赖。第一个“循环依赖”来自我的设计,因为我希望我的 DAL 返回域对象——我的意思是它是概念性的——第二个来自我的代码。
- 一个领域对象总是依赖于至少一个服务对象
- 域对象通过调用服务上的方法从存储库中检索他的属性
- 服务的方法调用 DAL
- 然而——问题是——当 DAL 完成他的工作时,他必须返回域对象。但是要创建这些对象,他必须注入所需的服务对象依赖项(因为域对象需要这些依赖项)。
- 因此,我的 DAL 存储库依赖于服务对象。
这导致了非常明显的周期性依赖。我对如何处理这种情况感到困惑。最后,我正在考虑让我的 DAL 返回 DTO,但它似乎与洋葱架构不兼容。因为 DTO 是在 Infrastructure 中定义的,但 Core 和 Service Layer 不应该知道 Infrastucture。
此外,我对更改存储库中所有方法的返回类型并不感到兴奋,因为我有数百行代码......
我将不胜感激任何帮助,谢谢!
更新
这是我的代码,可以使情况更清楚:
我的对象(在核心):
public class MyComplexClass1
{
MyComplexClass1 Property1 {get; set;}
MyComplexClass2 Property2 {get; set;}
private readonly IService MyService {get; set;}
public MyComplexClass1(IService MyService)
{
this.MyService = MyService;
this.Property1 = MyService.GetMyComplexClassList1();
.....
}
这是我的服务接口(在核心)
public interface IService
{
MyComplexClass1 GetMyComplexClassList1();
...
}
这是我的存储库接口(在核心中)
public interface IRepoComplexClass1
{
MyComplexClass1 GetMyComplexClassObject()
...
}
现在服务层实现了 IService,DAL 层实现了 IRepoComplexClass1。
但我的观点是,在我的仓库中,我需要构建我的域对象
这是基础设施层
using Core;
public Repo : IRepoComplexClass1
{
MyComplexClass1 GetMyComplexClassList1()
{
//Retrieve all the stuff...
//... And now it's time to convert the DTOs to Domain Objects
//I need to write
//DomainObject.Property1 = new MyComplexClass1(ID, Service);
//So my Repository has a dependency with my service and my service has a dependency with my repository, (Because my Service Methods, make use of the Repository). Then, Ninject is completely messed up.
}
我希望现在更清楚了。