gpt4 book ai didi

c# - 在 N 层、域驱动设计、MVC 应用程序中处理异常

转载 作者:太空宇宙 更新时间:2023-11-03 20:35:08 25 4
gpt4 key购买 nike

我构建了一个如下所示的 MVC 应用程序:

MVC应用-应用层-业务层-存储库-数据

我已经阅读了 many 的代码应用程序并发现似乎没有人以类似于数据传递方式的方式传递异常。

换句话说,数据通过接口(interface)被引用,并在不同的上下文中被重用。如果数据层发生异常,如何将其发送到 GUI 或相关层?应该使用接口(interface)吗? this 中处理异常的构造是什么申请?

最佳答案

我没有读过你链接的文档,但我有一个简单的案例,我引发异常以响应未能满足不变量。假设我正在创建一个实例并且由于某种原因它是“无效的”,比方说用户输入错误。不是让我的实体处于无效状态(这在 DDD 中是禁止的)并让系统“验证”它,而是在创建它时抛出异常。相关的“验证消息”(对于用户)是从不满足的同一个规范实例中提取的,我派生的异常包含 UI 需要的值。

InvariantException 示例:

public class InvariantException : MyAppException
{
public object FailingObject = null;
public ModelStateDictionary ModelState = new ModelStateDictionary();


public InvariantException() { }

public InvariantException(object failingObject, ModelStateDictionary messages)
{
this.FailingObject = failingObject;
this.ModelState = messages;
}

public InvariantException(object failingObject, ModelStateDictionary messages,
Exception innerException)
: base("refer to ModelState", innerException)
{
this.FailingObject = failingObject;
this.ModelState = messages;
}
}

为用户/UI 返回相关“验证消息”的规范示例:

public class PostFieldLengthSpecification : ISpecification<Post>
{
private const string TITLE_LENGTH_RANGE = "5-100";
private const string BODY_LENGTH_RANGE = "20-10000";


public bool IsSatisfiedBy(Post post)
{
return this.GetErrors(post).IsValid;
}


public ModelStateDictionary GetErrors(Post post)
{
ModelStateDictionary modelState = new ModelStateDictionary();

if (!post.Title.Trim().Length.Within(TITLE_LENGTH_RANGE))
modelState.AddModelError(StongTypeHelpers.GetPropertyName((Post p) => p.Title),
"Please make sure the title is between {0} characters in length".With(TITLE_LENGTH_RANGE));

if (!post.BodyMarkup.Trim().Length.Within(BODY_LENGTH_RANGE))
modelState.AddModelError(StongTypeHelpers.GetPropertyName((Post p) => p.BodyMarkup),
"Please make sure the post is between {0} characters in length".With(BODY_LENGTH_RANGE));

return modelState;
}
}

工厂如何从不创建无效实例,而是抛出异常并为 UI 存放消息的示例:

    public static Post GetNewPost(string title, string bodyMarkup, DateTime posted)
{
var post = new Post(0, title, bodyMarkup, posted, new List<Comment>());
var fieldLengthSpec = new PostFieldLengthSpecification();

if (fieldLengthSpec.IsSatisfiedBy(post))
return post;
else
throw new InvariantException(post, fieldLengthSpec.GetErrors(post));
}

最后,一个自定义模型绑定(bind)器示例,用于捕获所述异常并将“无效对象”传递回带有错误消息的操作:

public class PostModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(Post))
{
try
{
// Create Post
return base.BindModel(controllerContext, bindingContext);
}
catch (InvariantException ie)
{
// If invalid, add errors from factory to ModelState
bindingContext.ModelState.AddNewErrors(ie.ModelState);
bindingContext.ModelState.AddValuesFor<Post>(bindingContext.ValueProvider);
return ie.FailingObject;
}
}

希望这对您有所帮助。

关于c# - 在 N 层、域驱动设计、MVC 应用程序中处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5333952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com