我来自 Java/Spring 背景,我正在尝试学习 .NET 5。我正在开发 Web API,一切都很好,但不知何故我无法理解或使其工作,我已经尝试过在网上找到了一些解决方案,但随着多年来情况的变化,我不知道它们是否不再有效,或者是否有更好的方法来做到这一点。
基本上,我想处理 .NET API 中的错误。
我的服务有这个代码:
public Users execute(int id)
{
var foundUser = this.userRepository.findById(id);
if (foundUser == null)
{
throw new HttpException(HttpStatusCode.NotFound, "User not found");
}
return foundUser;
}
Run Code Online (Sandbox Code Playgroud)
HttpException 是我制作的自定义异常,因此我可以控制状态代码
using System;
using System.Net;
namespace dotnetex.shared.Errors
{
public class HttpException : Exception
{
public HttpStatusCode Status { get; set; }
public HttpException(HttpStatusCode status, string msg) : base(msg)
{
Status = status;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的启动类有指向我的路线的异常处理程序:
// This method gets called by the …Run Code Online (Sandbox Code Playgroud) 我通常喜欢做(我在 JS/TS 中这样做)基于接口的注入,并“注册一个令牌”指向一个默认的实现。所以如果有一天我需要创建一个新的实现,我不需要改变整个代码,我只需要将该令牌更改为另一个实现。
我试图在春天做同样的事情。但是我仍在学习它的 IOC 和 DI,我找不到这样的东西。
所以我的问题是,当我注入接口时,在我的控制器中,我需要使用“ @Qualifier ”,或者在我的实现中指定哪个是“@Primary”,以便@Autowired可以注入正确的实现。@Qualifier()的策略很好,因为它允许我按名称指定它,但是如果有一天需要更改实现,我仍然需要在整个项目中进行更改。
但我想知道是否有某种方法可以全局定义指向单个实现的默认注入点的配置?
提前致谢。对不起,如果我的解释不清楚,请告诉我
控制器方法
@Autowired
private IOrdinaryService iOrdinaryService;
@GetMapping("/")
void getMethodHangler() {
iCreateProjectService.execute(newEmployee);
}
Run Code Online (Sandbox Code Playgroud)
界面
package com.example.demo.modules.projects.services;
import com.example.demo.modules.projects.entities.Projects;
public interface IOrdinaryService{
void execute();
}
Run Code Online (Sandbox Code Playgroud)
实施1
@Service
public class OldWayOrdinaryService implements IOrdinaryService {
@Override
public void execute() {
System.out.println("foo");
}
}
Run Code Online (Sandbox Code Playgroud)
实施2
@Service
public class NewWayOrdinaryService implements IOrdinaryService {
@Override
public void execute() {
System.out.println("bar");
}
}
Run Code Online (Sandbox Code Playgroud)