dependency-injection - 应用层和领域层之间的依赖关系
问题描述
我想减少ApplicationLayer和DomainLayer之间的联系。考虑一下我在域项目中创建了一个 AggregateRoot。如果我直接从应用程序引用域就可以了。
但是我想使用接口而不是实现,所以我创建了Domain.Contract来保留Domain项目的接口和合同!Domain对这个项目有一个参考来实现接口。如何在应用层使用这个合约。换句话说:
Domain 有 Domain.Contract 的引用。
Application 有 Domain.Contract 的引用。
在域项目中,我
在 Domain.Contract 项目中有 Card 类在应用程序项目中有 ICard 接口我只想引用 Domain.contract,并且我有创建 Card 的 CommandHandlers 方法
CommandHandlerMethod()
{
var card = ICard?!!! //What should I do here?
repository.Save(card);
}
我发现的一种方法是使用工厂。但是工厂现在应该是接口和实现的类,它们在不同的项目中。如果我在 Domain.contract 项目中使用工厂,它将导致引用循环。如果我在域项目中使用工厂,应用程序项目将如何使用它?!
解决方案
你的工厂应该在你的域项目中实现并且应该是完全公开的。
它的目的是为应用层构建一个ICard,而不需要应用层直接与Card交互。如果部署在与工厂相同的项目中,则 Card 上的构造函数可以是内部的。
工厂不应在合同中。合约应该只包含接口,而不是任何实现,包括工厂。
是的,工厂必须知道接口和实现的类。这就是它的工作……创建一个接口的具体实现。
参考:
- 应用程序 > 域.Contract
- 应用 > 领域
- 域 > 域.合同
域名合约
public interface ICard
{
public string Value { get; }
public void SetValue(string value);
}
领域
public class Card : ICard
{
string Value { get; private set; }
public void SetValue(string value)
{
Value = value;
}
// INTERNAL. Can only be created by the factory, not the application
internal Card(string value)
{
SetValue(value);
}
}
public static class CardFactory
{
public static ICard CreateCard(string value)
{
return new Card(value);
}
}
应用
ICard card = CardFactory.CreateCard("Ace of Spades");
repo.Add(card);
推荐阅读
- python - Django tests.py django.db.utils.IntegrityError:唯一约束失败:auth_user.username
- video - 使用媒体源 api 对不同 gop 大小的 mp4 进行自适应比特率流式传输
- jquery - 如何将值传递给滑块中的拇指?
- windows - MinGW/Cygwin 在哪里将环境变量转换为 Windows 样式?
- python - Beautifulsoup 在属性中查找文本
- mysql - 使用另一个自动增量字段值 MySQL 更新字段
- algorithm - “对链表进行分区”是什么意思?
- string - PowerShell 表列到以“,”分隔的字符串
- oracle - 查询以列出 Oracle 表空间
- mysql - Laravel(xampp) 尝试将真实网站迁移到虚拟主机时出错:SQLSTATE[42S02]