我正在构建一个具有以下架构的应用程序:
UI - 应用程序 - 域 - 基础架构
我有一个需要使用自定义异常的应用层。我保留这些自定义异常的地方?在基础架构层?问题是我的Application Layer没有引用Infrastructure层。
正确的方法是什么?
更新
这是我在Application Layer中引发异常的代码:
public void InsertNewImage(ImagemDTO imagemDTO)
{
if (isValidContentType(imagemDTO.ImageStreamContentType))
{
string nameOfFile = String.Format("{0}{1}", Guid.NewGuid().ToString(), ContentTypeHelper.GetExtension(imagemDTO.ImageStreamContentType));
string path = String.Format("{0}{1}", ImageSettings.PathToSave, nameOfFile);
_fileService.SaveFile(imagemDTO.ImageStream, path);
Imagem imagem = new Imagem()
{
Titulo = imagemDTO.Titulo,
Descricao = imagemDTO.Descricao,
NomeArquivo = nameOfFile
};
_imagemRepository.Add(imagem);
_dbContext.SaveChanges();
} else
{
throw new WrongFileTypeException(String.Format("{0} is not allowed.", ContentTypeHelper.GetExtension(imagemDTO.ImageStreamContentType)));
}
}
甚至ImageSettings也是我的应用层中的ConfigurationSection,因为它使用它。我没有看到其他方式可以将我的ImageSettings(应该保留在基础设施层中)转移到基础架构层,有人可以提供帮助吗?
public class ImageSettings : ConfigurationSection
{
/// <summary>
/// Caminha onde será salvo as imagens
/// </summary>
[ConfigurationProperty("pathToSave", IsRequired = true)]
public string PathToSave
{
get { return (string)this["pathToSave"]; }
set { this["pathToSave"] = value; }
}
/// <summary>
/// Extensões permitidas pra upload
/// </summary>
[ConfigurationProperty("allowedExtensions", IsRequired = true)]
public string AllowedExtensions
{
get { return (string)this["allowedExtensions"]; }
set { this["allowedExtensions"] = value; }
}
/// <summary>
/// Tamanho das imagens
/// </summary>
[ConfigurationProperty("imageSize")]
public ImageSizeCollection ImageSize
{
get
{
return (ImageSizeCollection)this["imageSize"];
}
}
}
答案 0 :(得分:0)
您是否有一个层可以解决跨领域问题(例如日志记录或依赖注入)以及解决方案中所有其他项目引用的问题?如果是这样,那么您应该放置这些自定义异常。我想通过“基础设施层”你实际上意味着这个横切层,但如果是这样,你的应用层没有引用它似乎很奇怪。
或者,您可以将这些异常保留在应用程序层本身中,前提是这些异常仅由该层使用,也可能由UI层使用。
答案 1 :(得分:0)
这很可能与您的previous question有关。例外是由应用程序层定义的合同的一部分,由基础架构(DIP和Onion architecture)实现。它们应在应用条款中定义并由应用程序处理,但是从基础结构中抛出。例如,在您的应用程序代码中:
public class NotificationException : Exception {...}
public interface ICanNotifyUserOfSuccessfullRegistration {
/// <summary>
/// ...
/// </summary>
/// <exception cref="NotificationException"></exception>
void Notify();
}
在基础设施方面:
public class SmsNotificator : ICanNotifyUserOfSuccessfullRegistration {
public void Notify() {
try {
// try sending SMS here
} catch(SmsRelatedException smsException) {
throw new NotificationException(
"Unable to send SMS notification.", smsException);
}
}
}
答案 2 :(得分:0)
Acaz Souza - 你说应用层不应该引用基础设施层是错误的。我建议您阅读“快速推动域驱动设计”,可以从InfoQ免费获得。
请看下面的图表,这说明了我的观点。
由于
答案 3 :(得分:0)
在DDD中,哪里保留自定义异常(应用程序异常)?在基础架构层?
为什么?
我已经用代码示例撰写了有关Onion Architecture的文章。请检查this。
但基本上,您应该将自定义例外添加到图层(在这种情况下为Application)。只需创建一个文件夹“ Exceptions”,然后在其中添加用户定义的异常即可。请检查此链接以获取有关how to create user-defined exceptions
的详细信息