A injeção de dependência na página de vista personalizada gera um erro estranho
-
21-09-2019 - |
Pergunta
Estou tentando injetar coisas em uma página de vista personalizada (ModelViewPage, da MVCContrib)
public class ValidatedModelViewPage<T> : ModelViewPage<T> where T : class
{
public ValidatedModelViewPage(IEnumerable<IBehavior<IMemberElement>> elementBehaviors)
: base(elementBehaviors.ToArray()) { }
}
E meus registros do Autofac se parecem com o seguinte:
builder.RegisterCollection<IBehavior<IMemberElement>>().As<IEnumerable<IBehavior<IMemberElement>>>();
builder.Register<NotNullBehavior>().MemberOf<IEnumerable<IBehavior<IMemberElement>>>();
builder.Register<StringLenghBehavior>().MemberOf<IEnumerable<IBehavior<IMemberElement>>>();
builder.RegisterGeneric(typeof(ValidatedModelViewPage<>));
Mas recebo esse erro quando tento acessar uma visualização:
Compiler Error Message: CS1729: 'UKFS.Web.Views.ValidatedModelViewPage<UKFS.Data.Entities.Skadeanmälan>' does not contain a constructor that takes '0' arguments
Source Error:
Line 194: private static object @__fileDependencies;
Line 195:
Line 196: [System.Diagnostics.DebuggerNonUserCodeAttribute()]
Line 197: public views_skadeanmälan_edit_aspx() {
Line 198: string[] dependencies;
Source File: c:\Users\Carl\AppData\Local\Temp\Temporary ASP.NET Files\root\be9ddc15\a84d5058\App_Web_edit.aspx.b2d4184a.thgwih90.0.cs Line: 196
Eu não tinha noção, mas então olhei para app_web_edit.aspx.b2d4184a.thgwih90.0.cs e achei isso:
Line 190: public class views_skadeanmälan_edit_aspx : UKFS.Web.Views.ValidatedModelViewPage<Skadeanmälan>, System.Web.SessionState.IRequiresSessionState, System.Web.IHttpHandler {
Line 191:
Line 192: private static bool @__initialized;
Line 193:
Line 194: private static object @__fileDependencies;
Line 195:
Line 196: [System.Diagnostics.DebuggerNonUserCodeAttribute()]
Line 197: public views_skadeanmälan_edit_aspx() {
Obviamente, a classe Gerated Views_skadeanmälan_edit_aspx herda do meu ukfs.web.Views.ValidatedModelViewPage e, quando tenta institui -lo com a construção padrão. Então você pode resolvê -lo?
Solução
Você não poderá construir injeção em vistas, porque o compilador ASPX gera um CTOR vazio e, como deriva da sua classe base, sua classe base também deve ter um CTOR vazio.
Em vez disso, procuraria a injeção de propriedades, caso contrário, tente realizar o seguinte:
- Encontre o local onde o ViewPages é instanciado e obtenha o autofato lá para instanciar a página
- Peça ao compilador ASPX para não gerar o CTOR vazio
Eu não sei como fazer essas coisas, então procuraria a injeção de propriedades em vez disso