2009-07-17 6 views
1

インターフェイスのいくつかのメソッドを呼び出すWebユーザーコントロールがあります。 4つの異なるクラスがこのインタフェースを使用します。初期化や負荷に インターフェイスタイプでWebユーザーコントロールを読み込む方法

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

は、私はこのような制御を設定しています(WUC *はコントロールIDで、プロバイダはインタフェースを実装するクラスのプロパティです):

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

質問コントロールでこれを宣言的に行うことはできますか?
オブジェクトデータソースを使用しようとしていますが、プロパティがインスタンス化されるのが遅すぎます。

<CSControl:MultiTextUpdate ID="wucMultiTextBonuses" ControlTitle="Bonuses" runat="server" Provider="what goes here???" CampaignId="<%# CampaignId %>" /> 

そして、一つの制御を書くときにインターフェイスで機能を実行するために使用するより良いモデルがありますか? プロバイダの代わりにProviderTypeと、新しいインスタンスを呼び出す方法が必要なのでしょうか?

答えて

1

コントロールのプロパティとしてインスタンス化する型を取得するために、「ProviderType」ソリューションを使用します。ここでは、(コンソールアプリケーションを使用して)タイプ名から始まるオブジェクトを作成する方法の簡単な例を示します。

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())); 
     } 
    } 
} 
関連する問題