Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在实现接口的存储库中定义公共常量字符串_C# - Fatal编程技术网

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我添加了这一点作为免责声明,不过我觉得这可能是一个很好的间接回答。在我看来,瘦控制器在几乎所有情况下都是一种好模式。