在DDD中保留自定义异常(应用程序异常)?在基础架构层?

时间:2011-10-03 12:09:57

标签: .net domain-driven-design

我正在构建一个具有以下架构的应用程序:

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"];
        }
    }
}

4 个答案:

答案 0 :(得分:0)

您是否有一个层可以解决跨领域问题(例如日志记录或依赖注入)以及解决方案中所有其他项目引用的问题?如果是这样,那么您应该放置这些自定义异常。我想通过“基础设施层”你实际上意味着这个横切层,但如果是这样,你的应用层没有引用它似乎很奇怪。

或者,您可以将这些异常保留在应用程序层本身中,前提是这些异常仅由该层使用,也可能由UI层使用。

答案 1 :(得分:0)

这很可能与您的previous question有关。例外是由应用程序层定义的合同的一部分,由基础架构(DIPOnion 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免费获得。

请看下面的图表,这说明了我的观点。

由于

Domain Driven Design - Layers

答案 3 :(得分:0)

在DDD中,哪里保留自定义异常(应用程序异常)?在基础架构层?

为什么?

  • 在“干净的体系结构”中,中心层从不依赖于外部,而总是与之相反
  • “基本规则是,所有代码都可以依赖于更中心的层,但是代码不能依赖于离内核较远的层。换句话说,所有耦合都朝向中心。”请检查Jeffrey Palermo的article

我已经用代码示例撰写了有关Onion Architecture的文章。请检查this

但基本上,您应该将自定义例外添加到图层(在这种情况下为Application)。只需创建一个文件夹“ Exceptions”,然后在其中添加用户定义的异常即可。请检查此链接以获取有关how to create user-defined exceptions

的详细信息