Saya membuat aplikasi .NET Core MVC dan menggunakan Dependency Injection dan Repository Pattern untuk menyuntikkan repositori ke controller saya. Namun, saya mendapatkan kesalahan:
InvalidOperationException: Tidak dapat menyelesaikan layanan untuk tipe 'WebApplication1.Data.BloggerRepository' saat mencoba mengaktifkan 'WebApplication1.Controllers.BlogController'.
Model (Blog.cs)
namespace WebApplication1.Models
{
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
}
DbContext (BloggingContext.cs)
using Microsoft.EntityFrameworkCore;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
}
}
Repositori (IBloggerRepository.cs & BloggerRepository.cs)
using System;
using System.Collections.Generic;
using WebApplication1.Models;
namespace WebApplication1.Data
{
internal interface IBloggerRepository : IDisposable
{
IEnumerable<Blog> GetBlogs();
void InsertBlog(Blog blog);
void Save();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggerRepository : IBloggerRepository
{
private readonly BloggingContext _context;
public BloggerRepository(BloggingContext context)
{
_context = context;
}
public IEnumerable<Blog> GetBlogs()
{
return _context.Blogs.ToList();
}
public void InsertBlog(Blog blog)
{
_context.Blogs.Add(blog);
}
public void Save()
{
_context.SaveChanges();
}
private bool _disposed;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_context.Dispose();
}
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
Startup.cs (kode yang relevan)
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<BloggingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<IBloggerRepository, BloggerRepository>();
services.AddMvc();
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
Pengontrol (BlogController.cs)
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using WebApplication1.Data;
using WebApplication1.Models;
namespace WebApplication1.Controllers
{
public class BlogController : Controller
{
private readonly IBloggerRepository _repository;
public BlogController(BloggerRepository repository)
{
_repository = repository;
}
public IActionResult Index()
{
return View(_repository.GetBlogs().ToList());
}
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Blog blog)
{
if (ModelState.IsValid)
{
_repository.InsertBlog(blog);
_repository.Save();
return RedirectToAction("Index");
}
return View(blog);
}
}
}
Saya tidak yakin apa yang saya lakukan salah. Ada ide?
Jawaban:
Pengecualian mengatakan itu tidak dapat menyelesaikan layanan
WebApplication1.Data.BloggerRepository
karena konstruktor pada pengontrol Anda meminta kelas konkret bukan antarmuka. Jadi ubah saja:sumber
HttpContextAccessor
kelas, ternyata saya membutuhkanIHttpContextAccessor
Saya mengalami masalah ini karena dalam pengaturan injeksi dependensi saya kehilangan dependensi dari repositori yang merupakan ketergantungan dari controller:
sumber
Dalam kasus saya, saya mencoba melakukan injeksi ketergantungan untuk objek yang memerlukan argumen konstruktor. Dalam hal ini, selama Startup saya hanya memberikan argumen dari file konfigurasi, misalnya:
sumber
Saya mengalami masalah yang berbeda, dan yeah konstruktor parameter untuk controller saya sudah ditambahkan dengan antarmuka yang benar. Apa yang saya lakukan adalah sesuatu yang langsung. Saya hanya pergi ke
startup.cs
file saya , di mana saya bisa melihat metode panggilan untuk mendaftar.Dalam kasus saya,
Register
metode ini berada di kelas yang terpisahInjector
. Jadi saya harus menambahkan Antarmuka baru saya yang diperkenalkan di sana.Jika Anda melihat, parameter untuk fungsi ini adalah
this IServiceCollection
Semoga ini membantu.
sumber
Hanya jika ada orang yang memiliki situasi yang sama seperti saya, saya melakukan tutorial EntityFramework dengan database yang ada, tetapi ketika konteks database baru dibuat pada folder model, kita perlu memperbarui konteks di startup, tetapi tidak hanya dalam layanan. AddDbContext tetapi AddIdentity juga jika Anda memiliki otentikasi pengguna
sumber
Anda perlu menambahkan layanan baru
DBcontext
di startupDefault
Tambahkan ini
sumber
Anda lupa menambahkan "services.AddScoped" dalam
ConfigureServices
metode startup .sumber
Saya mendapatkan masalah ini karena kesalahan yang agak konyol. Saya lupa mengaitkan prosedur konfigurasi layanan untuk menemukan pengontrol secara otomatis di aplikasi Core ASP.NET.
Menambahkan metode ini menyelesaikannya:
sumber
Saya harus menambahkan baris ini di ConfigureServices agar dapat berfungsi.
sumber
Saya mendapatkan di bawah pengecualian
Karena saya ingin mendaftar Pabrik untuk membuat turunan DbContext Berasal dari kelas IBlogContextFactory dan menggunakan metode Buat untuk instantiate instance dari Blog Context sehingga saya dapat menggunakan pola di bawah ini bersama dengan dependensi Injeksi dan juga dapat menggunakan mengejek untuk pengujian unit.
pola yang ingin saya gunakan adalah
Tapi Alih-alih BloggingContext baru () Saya ingin Menyuntikkan pabrik melalui konstruktor seperti di bawah kelas BlogController
di sini adalah kode registrasi layanan saya
dan di bawah ini adalah model dan kelas pabrik saya
----- Untuk Memperbaiki ini dalam proyek .net Core MVC - Saya melakukan perubahan di bawah ini pada pendaftaran ketergantungan
Singkatnya. Pengembang inti internet bertanggung jawab untuk menyuntikkan fungsi pabrik, yang dalam kasus Unity dan .Net Framework diurus.
sumber
Masalah ini karena Anda tidak mendaftarkan komponen akses data dengan antarmuka yang ditulis untuk itu. Coba gunakan sebagai berikut
sumber
Jika Anda menggunakan AutoFac dan mendapatkan kesalahan ini, Anda harus menambahkan pernyataan "As" untuk menentukan layanan yang diterapkan oleh implementasi konkret.
Yaitu. Anda harus menulis:
dari pada
sumber
ohh, Terima kasih @kimbaudi, saya mengikuti kata-kata ini
https://dotnettutorials.net/lesson/generic-repository-pattern-csharp-mvc/
dan mendapat kesalahan yang sama dengan Anda. Tetapi setelah membaca kode Anda saya menemukan solusi saya menambahkan
ke dalam metode ConfigureServices dalam file StartUp.cs =))
sumber
Menyelesaikan layanan dilakukan bahkan sebelum kode kelas tercapai, jadi kita perlu memeriksa injeksi ketergantungan kita.
Dalam kasus saya, saya menambahkan
di StartupExtensions.cs
sumber
Tambahkan layanan. Tambahkan Singleton (); dalam metode ConfigureServices Anda dari file Startup.cs proyek Anda.
Untuk perincian lebih lanjut, silakan kunjungi URL ini: https://www.youtube.com/watch?v=aMjiiWtfj2M
untuk Semua metode (yaitu AddSingleton vs AddScoped vs AddTransient) Silakan kunjungi URL ini: https://www.youtube.com/watch?v=v6Nr7Zman_Y&list=PL6n9fhu94yhVkdrusLaQsfERmL_Jh4XmU&index=44 )
sumber
Saya memiliki masalah yang sama dan menemukan bahwa kode saya menggunakan injeksi sebelum diinisialisasi.
Saya tahu itu tidak ada hubungannya dengan pertanyaan itu, tetapi karena saya dikirim ke halaman ini, saya pikir itu berguna bagi orang lain.
sumber
Saya diganti
Dengan
Dan itu berhasil untuk saya.
sumber
Saya mendapatkan kesalahan ini karena saya mendeklarasikan variabel (di atas metode ConfigureServices) dari tipe yang merupakan konteks saya. Saya punya:
Tidak yakin apa yang saya pikirkan. Saya tahu adalah sah untuk melakukan ini jika Anda mengirimkan parameter ke metode Konfigurasi.
sumber
Saya menerima kesalahan: "tidak dapat menyelesaikan dependensi xxxxxxxx untuk semua versi .net core". Saya mencoba semua yang tersedia di internet dan macet selama berhari-hari. Satu-satunya solusi yang saya buat adalah menambahkan file nuget.config di proyek dan kemudian menggunakan pengembalian dotnet untuk membuatnya bekerja.
Konten file nuget.config:
sumber