.net core中的类(非控制器类)中的构造函数注入(依赖注入)

0yg35tkg  于 2023-08-08  发布在  .NET
关注(0)|答案(1)|浏览(146)

我很难理解如何在这种情况下使用依赖注入。
让我逐一介绍我的档案。
名为ITxtManipulator.cs的合约

public interface ITxtManipulator
{
    public string StringCapitalize(string incoming_string);
}

字符串
名为TxtManipulatorA.cs的类实现ITxtManipulator接口

public class TxtManipulatorA : ITxtManipulator
{
    public string StringCapitalize(string incoming_string)
    {
        return incoming_string.ToUpper();
    }
}


这是我注册依赖注入的program.cs

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddScoped<ITxtManipulator, TxtManipulatorA>();   // <------- HERE

builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();


我有一个应用层。我创建了一个名为SomeApplication.cs的类,这是我想要调用ITxtManipulator对象并使用它作为方法的地方。我尝试使用构造函数注入。

public class SomeApplication
{
    private readonly ITxtManipulator _magicTxtManipulator;
    
    public SomeApplication(ITxtManipulator dotnetGiveTxtManipulator)
    {
        _magicTxtManipulator = dotnetGiveTxtManipulator;
    }

    public string GetStudentDefault()
    {
        return _magicTxtManipulator.StringCapitalize("raj");
    }
}


最后,我想调用StudentController.cs中的方法'GetStudentDefault()'。这就是我被卡住并出错的地方。

[ApiController]
[Route("api/[controller]")]
public class StudentController : ControllerBase
{
    public string Get()
    {
        return new SomeApplication().GetStudentDefault();  // <--- COMPILE ERROR
    }
}


给我错误!(我无法执行代码本身)因为SomeApplication的构造函数需要一个参数(ITxtManipulator),我无法传递,而dotnet必须提供。
想在控制器类中使用依赖注入。
我想在应用层(SomeApplication.cs)中进行依赖注入,然后调用控制器类中的方法来实现关注点分离。
有人能建议一种方法来利用依赖注入并满足我在这个场景中的架构需求吗?

c3frrgcw

c3frrgcw1#

你实际上是从一个Controller调用构造函数。这意味着您可以在Controller的构造函数中注入ITxtManipulator,使用该值设置字段并将其添加到SomeApplication的构造函数参数中。你的StudentController类看起来像这样:

[ApiController]
[Route("api/[controller]")]
public class StudentController : ControllerBase
{
    private ITxtManipulator _manipulator;
    public StudentController(ITxtManipulator manipulator) 
    {
        _manipulator = manipulator;
    }
    
    [HttpGet]
    public string Get()
    {
        return new SomeApplication(_manipulator).GetStudentDefault();
    }
}

字符串

相关问题