2009-07-17 3 views
1

Ich habe ein Web-Benutzer-Steuerelement, die einige Methoden einer Schnittstelle aufrufen. Vier verschiedene Klassen verwenden diese Schnittstelle.Wie Web-Benutzersteuerelemente mit Interface-Typ laden

public interface IMultiTextProvider 
{ 
    bool Insert(string text, Guid campaignId); 
    IEnumerable<IMultiTextItem> GetItems(Guid campaignId); 
} 

In init oder Last Ich gründe die Bedienelemente wie folgt auf (wo WUC * eine Steuer-ID ist, und Provider ist Eigentum einer Klasse, die die Schnittstelle implementiert):

private void SetMulitTextClassTypes() 
    { 
     wucMultiTextHandsetOrPlan.Provider = new HandsetOrPlanProvider(); 
     wucMultiTextCallToAction.Provider = new CallToActionProvider(); 
     wucMultiTextBonuses.Provider = new BonusProvider(); 
     wucMultiTextRequirements.Provider = new RequirementProvider(); 
    } 

Die Frage Kann ich das deklarativ in der Steuerung machen?
Ich versuche, eine Objektdatenquelle zu verwenden, und die Eigenschaft wird zu spät instanziiert.

Und gibt es ein viel besseres Modell zum Schreiben eines Steuerelements zum Ausführen von Funktionen in einer Schnittstelle? Vielleicht brauche ich ProviderType anstelle von Provider und eine Möglichkeit, eine neue Instanz aufzurufen ...?

Antwort

1

Ich würde für die "ProviderType" -Lösung gehen, als Eigenschaft des Steuerelements verwenden, um den Typ zu instanziieren. Hier ist ein kurzes Beispiel dafür, wie man ein Objekt beginnend mit dem Typnamen (mit einer Konsolenanwendung) erstellt.

namespace TypeTest{ 

    public interface IMultiTextProvider { 
     bool Insert(string text, Guid campaignId); 
    } 

    public class BonusProvider : IMultiTextProvider { 
     public bool Insert(string text, Guid campaignId) { 
      return true; 
     } 
    } 

    class Program { 
     static void Main(string[] args) { 

      string typeName = "TypeTest.BonusProvider"; 
      Type providerType = Type.GetType(typeName); 
      IMultiTextProvider provider = Activator.CreateInstance(providerType) 
       as IMultiTextProvider; 
      if (null == provider) { 
       throw new ArgumentException("ProviderType does not implement IMultiTextProvider interface"); 
      } 
      Console.WriteLine(provider.Insert("test",new Guid())); 
     } 
    } 
}