2011-07-06 28 views
20

私はASP MVC 3アプリケーションで作業しており、カスタムhtmlヘルパーを作成しています。それは特別なものではないか、または非常に複雑ですが、構造マップからのインタフェースのインスタンスが必要です。メソッドの内部から構造体のオブジェクトファクトリを呼び出すことはできますが、アプリケーションの残りの部分はサービスの場所ではなくIoCを使用しているので、そのまま使用したいと思います。拡張メソッドでIoCを使用する

内部とasp net mvc appからの拡張メソッドにインターフェイスを挿入する方法はありますか?

UPDATE

私は役立つかもしれないやっているものの例:次のように使用されている

public static class ShowUrl 
{ 
    public static string ForShow(this UrlHelper url, int showId) 
    { 
     var service = ObjectFactory.GetInstance<IPerformanceService>(); 

     var showName = service.GetPerformanceTitle(showId); 

     return url.Action(MVC.Performance.Details(showId, showName.ToFriendlyUrl())); 
    } 
} 

:私は、URLを構築しようとしています

基本的に
<a href='<%= Url.ForShow(1)%>'> 

エンティティIDからのスラッグでたぶん私はちょうど本当に愚かな方法でこれについて行くつもりです。

+0

あなたはMVC DependencyResolverを使用していますか? – mccow002

答えて

6

拡張メソッドに依存関係を挿入する方法はありません。

ASP.NET MVCヘルパーの場合、何らかの抽象的なものを埋め込んでいるかどうかにかかわらず、何らかのサービスロケーションを実行する必要があります。

+3

メソッドの引数(メソッドインジェクション)として依存関係を渡すだけで、依存関係を拡張メソッドに注入できます。しかし、特に複数の依存関係を渡す必要がある場合は、これは便利ではありません。 – Steven

+1

良い点。私はもともと正確にそれを示すいくつかのデモコードを含んでいましたが、最終結果がそれほどきれいではないことを認識しました。 –

21

私はこのことをお勧めしません。通常、エクステンションメソッドは、型に対して直接、単純でよく知られた操作に最もよく使用されます。拡張メソッドが別の型のインスタンスを持つことに依存している場合、それは拡張メソッドではない可能性があります。

この機能を実行する実際のサービスクラスを作成し、必要な場所に注入することを検討してください。拡張メソッドでこれを本当に必要とする場合は、拡張メソッドが必要とする別の静的クラス/メソッドの機能をラップし、あらゆる種類の注入や場所の使用を避けることを検討してください。

特定のコードを共有すると、特定の状況をより詳細に把握できます。

6

拡張メソッドで直接structuremapを呼び出してはいけません。今、あなたはあなたのユニットテストの方法でIPerformanceServiceの具体的な実装に渡すことができます

public static class ShowUrl 
{ 
    public static string ForShow(this UrlHelper url, int showId) 
    { 
     //Use the MVC DependencyResolver NOT Structuremap directly (DependencyResolver is using structuremap) 
     return url.ForShow(showId, DependencyResolver.Current.GetService<IPerformanceService>()) 
    } 

    //For Unit Testing 
    public static string ForShow(this UrlHelper url, int showId, IPerformanceService performanceService) 
    { 
     var showName = performanceService.GetPerformanceTitle(showId); 
     return url.Action(MVC.Performance.Details(showId, showName.ToFriendlyUrl())); 
    } 
} 

:また、あなたは以下のようなIPerformanceService引数を取ります検証可能なバージョンを作成する必要があります。

Assert.Equal("TheUrl", url.ForShow(8, new PerformanceService()); 

UrlHelperをあざけるの詳細情報:ASP.NET MVC: Unit testing controllers that use UrlHelper

関連する問題