【问题标题】:How to DRY common actions in ASP.NET Controllers that inherit from different base classes?如何干燥从不同基类继承的 ASP.NET 控制器中的常见操作?
【发布时间】:2023-02-13 15:59:45
【问题描述】:

假设我有 2 个控制器:

public class FirstController : FirstBase
{
    [HttpGet]
    public object Get()
    {
        return new { Name = "John" };
    }
}


public class SecondController : SecondBase
{
    [HttpGet]
    public object Get()
    {
        return new { Name = "John" };
    }
}

如您所见,它们都继承自不同的类。但是它们也有一个可以在它们之间共享的共享方法。

由于 C# 不支持组合(没有多重继承),我是否可以选择 DRY 该方法?

附言我知道接口中的默认成员可能是一个解决方案。但这对于泛型类以及 IoC 和 DI 来说太有限了。

【问题讨论】:

  • 控制器用于将端点分组在一起。更好的方法是将业务从控制器中移开
  • @Eldar OP 代码示例中的业务在哪里?
  • @SaeedNeamati 它在问题的字里行间,听起来像是在对我大喊大叫。当然,OP 提供更多有关它的上下文会更好。
  • @Eldar,不,我不会对你大喊大叫。我只是在这里看不到任何可以标记为的代码业务代码.这就是我问的原因。

标签: c#


【解决方案1】:

Composition is not an equivalent继承。

您应该在 .net 中将您的逻辑分离到不同的类和组合中。然后你可以在控制器中使用它作为 dependency injection 的依赖:

public class UserService
{
    public object GetUser() => new { Name = "John" };
}

public class FirstController : FirstBase
{
    private readonly UserService userService;
    public FirstController(UserService userService)
    {
        this.userService = userService;
    }

    [HttpGet]
    public object Get() => userService.GetUser();
}


public class SecondController : SecondBase
{
    private readonly UserService userService;
    public SecondController(UserService userService)
    {
        this.userService = userService;
    }

    [HttpGet]
    public object Get() => userService.GetUser();
}

.NET 支持依赖注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现控制反转 (IoC) 的技术。 .NET 中的依赖注入是框架的内置部分,还有配置、日志记录和选项模式。

依赖项是另一个对象所依赖的对象。

请注意,依赖注入与接口和抽象相关,因此在使用 DI 时使用它很重要。这是 SOLID 原则的一部分。接口从具体实现中提供了一定程度的抽象,使替换实现变得更容易,并允许更大的灵活性和可重用性以及更容易使用模拟进行测试。

你需要register your dependencies in DI-container

// use AddScoped to add TestRepo to DI-container
builder.Services.AddScoped<UserService>();

最后了解依赖注入的生命周期在 ASP.Net (Core) 应用程序中非常重要。瞬态对象总是不同的;为每个控制器和每个服务提供一个新实例。作用域对象在一个请求中是相同的,但在不同的请求中是不同的。单例对象对于每个对象和每个请求都是相同的。您可以在 .net 教程“Use dependency injection in .NET”中了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多