Saya telah mengikuti tutorial ini yang berhasil dengan baik, sampai saya memodifikasi saya DbContext
untuk memiliki konstruktor tambahan. Saya sekarang mengalami masalah dengan resolusi dan tidak yakin apa yang harus dilakukan untuk memperbaikinya. Apakah ada cara mudah untuk memaksanya mengambil konstruktor tanpa parameter atau saya melakukan pendekatan yang salah?
DbContext
dengan dua konstruktor:
public class DashboardDbContext : DbContext
{
public DashboardDbContext() : base("DefaultConnection") { }
public DashboardDbContext(DbConnection dbConnection, bool owns)
: base(dbConnection, owns) { }
}
SiteController
konstruktor:
private readonly IDashboardRepository _repo;
public SiteController(IDashboardRepository repo)
{
_repo = repo;
}
Gudang:
DashboardDbContext _context;
public DashboardRepository(DashboardDbContext context)
{
_context = context;
}
UnityResolver
kode:
public class UnityResolver : IDependencyResolver
{
private readonly IUnityContainer _container;
public UnityResolver(IUnityContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
try
{
return _container.Resolve(serviceType);
}
catch (ResolutionFailedException)
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return _container.ResolveAll(serviceType);
}
catch (ResolutionFailedException)
{
return new List<object>();
}
}
public IDependencyScope BeginScope()
{
var child = _container.CreateChildContainer();
return new UnityResolver(child);
}
public void Dispose()
{
_container.Dispose();
}
}
WebApiConfig:
var container = new UnityContainer();
container.RegisterType<IDashboardRepository, DashboardRepository>(new HierarchicalLifetimeManager());
config.DependencyResolver = new UnityResolver(container);
Kesalahan dari Panggilan WebApi:
System.InvalidOperationException: Terjadi kesalahan saat mencoba membuat pengontrol berjenis 'SiteController'. Pastikan bahwa pengontrol memiliki konstruktor publik tanpa parameter.
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()
InnerException: System.ArgumentException: Jenis 'Dashboard.Web.Controllers.SiteController' tidak memiliki konstruktor default.
at System.Linq.Expressions.Expression.New(Type type)
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
Tutorialnya sangat bagus dan telah bekerja dengan baik untuk saya sampai saya menambahkan konstruktor kedua.
SiteController
?
DbContext
ke dalam repositori?
SiteController
itulah yang harus memiliki konstruktor tanpa parameter, bukanDashboardDbContext
.