C# 如何在实现接口的存储库中定义公共常量字符串
我有一个C# 如何在实现接口的存储库中定义公共常量字符串,c#,C#,我有一个Controller类,它通过DI使用TodoRepository类,实现接口ITodoRepository 界面: public interface ITodoRepository { public bool ValidateTodo(Todo todo); } public static class TodoConstants { public const string INVALID_TODO_MESSAGE = "Invalid todo."; } 存储库类:
Controller
类,它通过DI使用TodoRepository
类,实现接口ITodoRepository
界面:
public interface ITodoRepository
{
public bool ValidateTodo(Todo todo);
}
public static class TodoConstants
{
public const string INVALID_TODO_MESSAGE = "Invalid todo.";
}
存储库类:
public class TodoRepository : ITodoRepository
{
public bool ValidateTodo(Todo todo)
{
//some validation
return false;
}
}
控制员:
public TodoController : BaseController
{
private readonly ITodoRepository _todoRepository;
private const string INVALID_TODO_MESSAGE = "Invalid todo.";
public TodoController(ITodoRepository todoRepository)
{
_todoRepository = todoRepository;
}
public IActionResult Post(Todo todo)
{
if(!_todoRepository.ValidateTodo(todo))
{
return new JsonResult(INVALID_TODO_MESSAGE);
}
}
}
为了能够在每个使用
TodoRepository
的Controller
中使用INVALID\u TODO\u MESSAGE
,我想将其移动到TodoRepository
,但这似乎是不可能的。另一种解决方案是在ITodoRepository
中创建一个只读属性,并在TodoRepository
中实现它,但我不确定这是否是最好的方法。您可以在接口旁边创建一个帮助器类:
public interface ITodoRepository
{
public bool ValidateTodo(Todo todo);
}
public static class TodoConstants
{
public const string INVALID_TODO_MESSAGE = "Invalid todo.";
}
您可以在任何地方使用它作为
TODO实例。无效的\u TODO\u消息
您可以在接口旁边创建一个帮助器类:
public interface ITodoRepository
{
public bool ValidateTodo(Todo todo);
}
public static class TodoConstants
{
public const string INVALID_TODO_MESSAGE = "Invalid todo.";
}
您可以在任何地方使用它作为
TodoConstants。无效的\u TODO\u消息
免责声明:这不是问题的直接答案,而是web应用程序中错误处理的设计建议
我将使用Exception
s实现这种验证。通常,您可以从应用程序层抛出业务异常(可能也包括存储库)。然后在web层(又名控制器、过滤器等),您可以实现一个ExceptionFilter
来处理业务异常,例如将它们转换为一个特殊的JsonResult
通过这种方式,您可以很好地分离关注点,并通过应用程序集中处理错误
请参阅此ASP.NET WebApi文档(MVC也几乎相同)
一些未经测试的伪代码如下所示
public class TodoRepository : ITodoRepository
{
public bool ValidateTodo(Todo todo)
{
//some validation
throw new ValidationException("Invalid todo");
}
}
public class MyBusinessExceptionFilterAttribute : ExceptionFilterAttribute
{
public void OnException(ExceptionContext filterContext)
{
...
filterContext.Result = new JsonResult(filterContext.Exception.Message);
...
}
}
public static void ApplicationStartup() {
...
GlobalFilters.Filters.Add(new MyBusinessExceptionFilterAttribute());
...
}
public IActionResult Post(Todo todo)
{
// Just let the exception to be thrown in case of business errors
_todoRepository.ValidateTodo(todo);
}
免责声明:这不是对问题的直接回答,而是对web应用程序中错误处理的设计建议 我将使用
Exception
s实现这种验证。通常,您可以从应用程序层抛出业务异常(可能也包括存储库)。然后在web层(又名控制器、过滤器等),您可以实现一个ExceptionFilter
来处理业务异常,例如将它们转换为一个特殊的JsonResult
通过这种方式,您可以很好地分离关注点,并通过应用程序集中处理错误
请参阅此ASP.NET WebApi文档(MVC也几乎相同)
一些未经测试的伪代码如下所示
public class TodoRepository : ITodoRepository
{
public bool ValidateTodo(Todo todo)
{
//some validation
throw new ValidationException("Invalid todo");
}
}
public class MyBusinessExceptionFilterAttribute : ExceptionFilterAttribute
{
public void OnException(ExceptionContext filterContext)
{
...
filterContext.Result = new JsonResult(filterContext.Exception.Message);
...
}
}
public static void ApplicationStartup() {
...
GlobalFilters.Filters.Add(new MyBusinessExceptionFilterAttribute());
...
}
public IActionResult Post(Todo todo)
{
// Just let the exception to be thrown in case of business errors
_todoRepository.ValidateTodo(todo);
}
您始终可以创建一个基本存储库,在那里实现只读属性,并从该基本存储库派生所有其他存储库?如果任何其他类需要重写该属性,则始终可以更进一步,使该属性在基中成为虚拟属性。其他解决方案为“是”。为接口中的消息定义一个getter。错误消息的(内容)真的属于契约吗?这里的明显路径是一个单独的、共享的类(甚至程序集)来保存字符串。您可以始终创建一个基本存储库,在那里实现只读属性,并从该基本存储库派生所有其他存储库?如果任何其他类需要重写该属性,则始终可以更进一步,使该属性在基中成为虚拟属性。其他解决方案为“是”。为接口中的消息定义一个getter。错误消息的(内容)真的属于契约吗?这里显而易见的路径是一个单独的、共享的类(甚至是程序集)来保存字符串。这是a)不是关于将消息保存在何处的答案,b)相当可疑的建议。这在很大程度上取决于这是一种什么样的验证。@HenkHolterman我添加了这一点作为免责声明,不过我觉得这可能是一个很好的间接回答。在我看来,瘦控制器在几乎所有情况下都是一种好模式。这不是一个关于在哪里保存消息的答案,而是一个相当可疑的建议。这在很大程度上取决于这是一种什么样的验证。@HenkHolterman我添加了这一点作为免责声明,不过我觉得这可能是一个很好的间接回答。在我看来,瘦控制器在几乎所有情况下都是一种好模式。