2011-01-06 14 views
1

私はwebformsを使用していますが、リポジトリへのフォローしている具体的なリファレンスをどのように削除することができますか?過去に私はMVCと城ウィンザーを使用しましたが、私はここでそれを使うことはできないと思いますか?背後コンストラクタからの依存関係の削除

コード:suggetedとして私はウィンザー工場

WindsorContainer container; 

public WindsorControllerFactory() 
{ 
    container = new WindsorContainer(
     new XmlInterpreter(new ConfigResource("castle"))); 

    var controllerTypes = 
     from t in Assembly.GetExecutingAssembly().GetTypes() 
     where typeof(IController).IsAssignableFrom(t) 
     select t; 

    foreach (Type t in controllerTypes) 
    { 
     container.AddComponentLifeStyle(t.FullName, t, 
      LifestyleType.Transient); 
    } 

    CommonServiceLocatorPageHandlerFactory.Container = container; 
} 
に追加のコードを追加するだけでなく、静的メソッドを更新しました

UPDATED

ICustomerRepository repos; 

public Workout_Admin() 
    // here is the offending concrete implementation 
    : this(new SqlCustomerRepository()) { } 

public Workout_Admin(ICustomerRepository repos) 
{ 
    this.repos = repos; 
} 

---

発生し続ける問題は、configファイルからアセンブリを読み込むことです。 CommonServiceLocatorPageHandlerFactoryがあり、assemblyという名前のアセンブリがyourfitという名前のファクトリです。そして、ここでは関係のconfigs

<httpHandlers> 
    <add verb="*" path="*.aspx" 
    type="YourFit.Factory.CommonServiceLocatorPageHandlerFactory, YourFit"/> 
</httpHandlers> 
<handlers> 
    <remove name="UrlRoutingHandler"/>   
    <add name="CSLPageHandler" verb="*" path="*.aspx" 
     type="YourFit.Factory.CommonServiceLocatorPageHandlerFactory, YourFit"/> 
</handlers> 

であり、誤差がある:

は、タイプをロードできませんでした 'YourFit.Factory.CommonServiceLocatorPageHandlerFactory' アセンブリから 'YourFit'。

私は本当に愚かである可能性が高いと思います。これであなたの時間をありがとうございました。

答えて

1

これは可能です。ただし、ASP.NETコンパイルエンジンにはデフォルトのコンストラクタが必要ですが、保護することができます。オーバーロードされた(public)コンストラクタに依存関係を挿入するカスタムPageHandlerFactoryを定義することによって、他のコンストラクタに依存関係を注入できます。

public class Workout_Admin : Page 
{ 
    ICustomerRepository repos; 

    protected Workout_Admin() { } 

    public Workout_Admin(ICustomerRepository repos) 
    { 
     this.repos = repos; 
    } 
} 

Here is an article(ちょうどウィンザーコンテナを呼び出すためにGetInstanceメソッドのコードを変更、城ウィンザーのため)これを実行する方法を示している:あなたのクラスには、次のようになります。これを完全に信頼する必要があることに注意してください。 (あなたは城ウィンザーコンテナを設定する)アプリケーションの起動パスで

public static IWindsorContainer Container; 

private static object GetInstance(Type type) 
{ 
    return Container.Resolve(type); 
} 

あなたはより:

UPDATE

あなたは記事は以下を説明しprivate static object GetInstance(Type type)方法を変更することができます静的Containerプロパティを設定する必要があります。

// Create 
IWindsorContainer container = ... 

// Configure 

// Set container to page handler factory 
CommonServiceLocatorPageHandlerFactory.Container = container; 

これは意味があると思います。

+0

このSOの質問もご覧ください。http://stackoverflow.com/questions/293790/how-to-use-castle-windsor-with-asp-net-web-forms – Steven

+0

ありがとうございます。私は現在、Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstanceのDLLを入手する方法を検討中です。 – hoakey

+0

この記事では、彼が「単純なService Locatorライブラリはそのインターフェイスに依存しているので、私は故意にCSLを使用しています。あなたはCSLを使用していないので、IoCライブラリで動作するようにコードを変更することは、以下に示すように、1行を変更することによって行うことができます。その後、彼は例を示すようには見えない。そのため、私はそれを実行すると、エラー "ファイルまたはアセンブリ 'CSL'またはその依存関係のいずれかを読み込めませんでした。何か案は? – hoakey

関連する問題