从类实例化实体框架控制器

时间:2018-05-16 16:29:22

标签: c# asp.net-core .net-core

我首先使用Entity Framework代码在.net核心项目中创建几个端点。

我有另一个类,并且想要在实体类控制器中使用其中一个方法而不进行API调用,因为它们都在同一个项目中,但我不确定该用于上下文。

NoteController

[Route("api/note")]
public class NoteController : Controller
{
    private readonly HDDbContext _context;

    public NoteController(HDDbContext  context)
    {
        _context = context;
    }

    [HttpGet("{userid}")]
    public async Task<IActionResult> GetNote([FromRoute] int userid)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var note= await _context.Note.SingleOrDefaultAsync(m => m.UserId == userid);

        if (note== null)
        {
            return NotFound();
        }

        return Ok(note);
    }
}

USENOTE 类:

是否可以在类中使用控制器方法?

public class USENOTE 
{
     NoteController  nc = new NoteController().GetNote(1) //Not sure if this is possible
}

1 个答案:

答案 0 :(得分:1)

其他人已经指出这是一个坏主意。这是你可以做的一个例子。

<强> NotesRepository.cs

在这种情况下,我将get-note-by-id逻辑重构为一个类,如下所示:

public class NotesRepository
{
    private readonly HDDbContext _context;
    public NotesRepository(HDDbContext context)
    {
        _context = context;
    }

    public Task<Note> GetNoteAsync(int id)
    {
        // your logic
        return note;
    }
}

<强> Startup.cs

将其注册到DI容器中,以便随处可访问:

public void ConfigureServices(IServiceCollection services)
{
    // ... the existing code

    // Register the notes repository as a service
    services.AddScoped<NotesRepository>();
}

您现在可以使用DI从任意数量的控制器/服务中使用它:

public class NoteController : Controller
{
    private readonly NotesRepository _notes;

    public NoteController(NotesRepository  notes)
    {
        _notes = notes;
    }

    [HttpGet("{userid}")]
    public async Task<IActionResult> GetNote([FromRoute] int userid)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var note = await _notes.GetAsync(userId);

        if (note == null)
        {
            return NotFound();
        }

        return Ok(note);
    }
}