Cómo registrar Umbraco RenderMvcControllers en asax
Estoy tratando de usar RenderMvcController
y SurfaceController
con la inyección de dependencia pero no funciona.
public class SupplierRenderMvcController : RenderMvcController
{
public HomeRenderMvcController(IMembershipService membershipService)
{
_membershipService = membershipService;
}
}
public class SupplierController : SurfaceController
{
public SupplierController(IMembershipService membershipService)
{
_membershipService = membershipService;
}
}
Tengo un error:
Ningún constructor sin parámetro definido para este objeto.
Los controladores de Umbraco están registrados en Global.asax
:
builder.RegisterControllers(typeof(UmbracoApplication).Assembly);
builder.RegisterApiControllers(typeof(UmbracoApplication).Assembly);
Tengo controladores api usando IoC sin ningún problema en otros proyectos de la misma solución.
Los controladores anteriores están en el proyecto principal de la solución sin embargo.
Esto es todo mío. Global.asax
del proyecto principal:
public class MvcApplication : IApplicationEventHandler
{
public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
AreaRegistration.RegisterAllAreas();
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
RegisterIoCContainer();
}
public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
private void RegisterIoCContainer()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterModelBinderProvider();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterControllers(typeof(UmbracoApplication).Assembly);
builder.RegisterApiControllers(typeof(UmbracoApplication).Assembly);
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterModule();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
}
MembershipService
está registrado dentro WebApiConfig
:
public class WebApiConfig : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.AddMediatR(this.GetType().Assembly);
builder.RegisterType().As();
}
}
Pregunta hecha hace 3 años, 4 meses, 13 días - Por logiclinguist
2 Respuestas:
-
El error que estás obteniendo indica que no se puede encontrar un constructor sin parámetros para los controladores
SupplierRenderMvcController
ySupplierController
cuando se intentan resolver las dependencias.Para solucionar este problema, debes asegurarte de que tus controladores tengan un constructor sin parámetros además del constructor con las dependencias que deseas inyectar. Esto es necesario ya que Umbraco necesita un constructor sin parámetros para poder crear una instancia de los controladores.
Aquí te muestro cómo puedes modificar tus controladores para tener un constructor sin parámetros:
csharp public class SupplierRenderMvcController : RenderMvcController { private IMembershipService _membershipService; // Constructor con dependencias public SupplierRenderMvcController(IMembershipService membershipService) { _membershipService = membershipService; } // Constructor sin parámetros public SupplierRenderMvcController() { // Puedes dejar este constructor vacío o inicializar variables por defecto si es necesario } } public class SupplierController : SurfaceController { private IMembershipService _membershipService; // Constructor con dependencias public SupplierController(IMembershipService membershipService) { _membershipService = membershipService; } // Constructor sin parámetros public SupplierController() { // Puedes dejar este constructor vacío o inicializar variables por defecto si es necesario } }
Una vez que hayas agregado los constructores sin parámetros a tus controladores, Umbraco podrá crear instancias de ellos correctamente. Recuerda que si necesitas inicializar alguna variable en el constructor sin parámetros, puedes hacerlo según tus necesidades.
Espero que esta solución te sea útil. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 18, 2020 a las 11:43 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Hay un par de problemas en el código proporcionado:
- El error "Ningún constructor sin parámetro definido para este objeto" es causado por el hecho de que el constructor de `UmbracoRenderMvcController` y `SurfaceController` espera un parámetro sin tipo, mientras que se proporciona un parámetro con tipo (`IMembershipService`). Para resolver esto, debes agregar un constructor sin parámetros a ambas clases controladoras, o proporcionar un constructor con el parámetro esperado por los constructores de `UmbracoRenderMvcController` y `SurfaceController`.
- Los controladores no se registran correctamente en `Global.asax`: En el código proporcionado, los controladores se registran dos veces:
<ul><li>`builder.RegisterControllers(typeof(UmbracoApplication).Assembly);` </li></ul> <ul><li>`builder.RegisterControllers(Assembly.GetExecutingAssembly());` </li></ul>
Esto puede provocar un conflicto de registro, ya que los controladores ya se registran con el ensamblado de
UmbracoApplication
. Para resolver esto, debes registrar los controladores solo una vez, preferiblemente utilizando el ensamblado de la aplicación que contiene los controladores.Aquí tienes un código actualizado que soluciona ambos problemas:
csharp public class SupplierRenderMvcController : RenderMvcController { public SupplierRenderMvcController() { } public SupplierRenderMvcController(IMembershipService membershipService) { _membershipService = membershipService; } } public class SupplierController : SurfaceController { public SupplierController() { } public SupplierController(IMembershipService membershipService) { _membershipService = membershipService; } } public class MvcApplication : IApplicationEventHandler { public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { AreaRegistration.RegisterAllAreas(); BundleConfig.Register básicamenteles(BundleTable.bundles); GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); RegisterIoCContainer(); } public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { } public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { } private void RegisterIoCContainer() { var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly()); builder.RegisterModelBinders(Assembly.GetExecutingAssembly()); builder.RegisterModelBinderProvider(); builder.RegisterControllers(typeof(UmbracoApplication).Assembly); builder.RegisterApiControllers(typeof(UmbracoApplication).Assembly); builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); builder.RegisterModule
(); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; } } Espero que esto resuelva los problemas con el registro de
RenderMvcController
ySurfaceController
y permita que las dependencias se inyecten correctamente.Respondida el Dec 18, 2020 a las 11:49 - por Gemini
Votos positivos: 0 | Votos negativos: 0