2017-07-20 1 views
0

Je souhaite injecter une interface dans un contrôle d'utilisateur ASP. Mes classes ressemblent à:Interface d'injection IOC Unity dans le contrôle ASP

public partial class PercentByState : CommonControlsData 
{ 
    [Dependency] 
    public IChartService ChartService { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      DataTable dt = ReportService.DoSomething(); 
     } 
    } 
} 
public class CommonControlsData : System.Web.UI.UserControl 
{ 
    [Dependency] 
    public IReportService ReportService { get; set; } 
} 

J'utilise les paquets nuget Unity et Unity.WebForms.

méthode RegisterDependencies ressemble à:

private static void RegisterDependencies(IUnityContainer container) 
    { 
     //services 
     container.RegisterType<IReportService, ReportService>(); 
    } 

ReportService et ChartService sont nulles dans Page_Load() fonction.

Des idées que fais-je tort?

Edit: Je suis en train de charger dynamiquement les contrôles avec le code suivant:

TableRow tableRow = new TableRow(); 
TableCell tableCell = new TableCell(); 
string controlName = feature.ControlName; 
tableCell.Controls.Add(Page.LoadControl(controlName)); 
tableRow.Controls.Add(tableCell); 
MainContentTable.Rows.Add(tableRow); 

De plus, mes contrôles ne sont pas enregistrés à la page avec une commande Enregistrer . Je pense que cela a quelque chose à voir avec ce type de chargement.

+0

Typiquement, pour ASP.NET WebForms Les propriétés de page marquées comme 'Dependency' sont ce qui est injecté. Si les UserControls ne sont pas des dépendances de page, je ne pense pas qu'ils seront "construits" par Unity. –

+0

comment puis-je injecter dans les contrôles utilisateur alors? –

+0

Je pense que j'avais tort ... Si vous utilisez Unity.WebForms, il semble que tous les contrôles devraient être construits (et les dépendances injectées). Il est difficile de dire à partir de ce que vous avez posté quel est le problème - l'affichage d'un exemple minimal, complet et vérifiable serait utile (bien qu'il y ait beaucoup de fichiers impliqués). Autres choses à prendre en compte: les dépendances * any * sont-elles injectées ou s'agit-il simplement d'un problème avec les contrôles enfants, est-ce que UnityHttpModule est enregistré? –

Répondre

1

Puisque vous chargez dynamiquement des contrôles que vous aurez besoin de les construire manuellement:

TableRow tableRow = new TableRow(); 
TableCell tableCell = new TableCell(); 
string controlName = feature.ControlName; 
var control = Page.LoadControl(controlName); 
Context.GetChildContainer().BuildUp(control.GetType().UnderlyingSystemType, control); 
tableCell.Controls.Add(control); 
tableRow.Controls.Add(tableCell); 
MainContentTable.Rows.Add(tableRow); 

Pour l'unité à BuildUp le contrôle qu'il devra connaître le type de contrôle effectif pour construire ce qui est pourquoi UnderlyingSystemType est utilisé comme argument Type dans l'appel BuildUp. L'alternative consiste à lancer le contrôle au type approprié, mais cela peut ne pas être connu au moment de la compilation.

+0

J'ai fini par hériter de tous les contrôles d'une classe générique et de déplacer les interfaces vers cette classe. Si quelqu'un a besoin de mon code, laissez-moi un message. –