2010-11-27 10 views
5

私はUnityでDependency Resolverを使用しようとしていますが、コントローラの作成時に問題があります。コントローラの ここでは例:コントローラは、作成しようMVC 3ベータ+依存関係リゾルバ+ Unity =問題が発生しました

public class AccountController : Controller 
{ 
    private readonly ICourseService _courseService; 

    public AccountController(ICourseService courseService) 
    { 
     _courseService = courseService; 
    } 
} 

しかし、 - 私は例外だ「このオブジェクトのために定義されていませんパラメータなしのコンストラクタを。」私はこのコントローラーのデフォルトのコンストラクターを追加しようとしますが、courseServiceは作成しませんでした。また、[Dependency]属性でプロパティを追加しようとしましたが、何も起こりませんでした。ここ は、依存リゾルバクラスです:

public class UnityDependencyResolver : IDependencyResolver 
{ 
    private readonly IUnityContainer _container; 
    public UnityDependencyResolver(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : new List<object>(); 
    } 
} 

とGlobal.asax.cs:

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     var container = new UnityContainer(); 
     container.RegisterType<ICourseService, CourseService>(); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 

誰も私を助けることができますか?

+0

あなたがこの問題の解決策を見つけるか、私は同じエラーを取得しています。ありがとう – NullReference

答えて

2

IDependencyResolver実装では、AccountControllerが登録されている必要があります。この登録を追加しないと、nullが返され、MVCはパラメータなしのctorを必要とするActivatorでコントローラを作成しようとします。

+0

MVCがHomeControllerを要求したときにGetServiceメソッドがnullを返しましたが、「[MissingMethodException:このオブジェクトに対して定義されたパラメータのないコンストラクタがありません」という例外が発生しました] "と" [InvalidOperationException: 'Webサイトのコントローラを作成しようとして、 Controllers.AccountController '。コントローラにパラメータのないpublicコンストラクタがあることを確認してください。多分私はこれのためにいくつかのクラスを書き直す必要がありますか? – drsim

+0

container.RegisterType ()をApplication_Startに追加しよう –

0

問題は、MVCはパラメータなしのコンストラクタを必要とするデフォルトのコントローラファクトリを使用してコントローラをインスタンス化しようとしており、UnityコンテナやICourseServiceの依存関係を解決する方法がないことです。

Unity(特にGetControllerInstance(Type type)を上書きするカスタムコントローラーファクトリを構築する必要があります - このために多くのドキュメントとサンプルが必要です;簡単なクラスです - Application_Startに次のように登録してください:

ControllerBuilder.Current.SetControllerFactory (new MyUnityControllerFactory(container)); 
5

旧ポストが、これらの他の回答は間違って平坦である。今日、この問題を自分で持っていた、とあなたは間違いなく、コントローラまたはコントローラの工場を登録する必要はありません。このメッセージは、単にそのための依存関係の階層で何かを意味コントローラが登録されていません。コントローラがコンストラクタにIServiceを必要とし、IServiceにIRepositが必要な場合oryをコンストラクタに入れましたが、IRepositoryの登録を忘れた場合、このエラーが発生します。

+0

DanHが正しいため、MVCがインスタンス化できるものは何も登録する必要はありません。これにはコントローラが含まれます。 – bzarah

1

あなたのコントローラーが具体的でない登録されたタイプに依存している場合、上のコードは壊れます。次へのgetService()を修正する必要があります。

public object GetService(Type serviceType){ 
    if (!container.IsRegistered(serviceType)){ 
     if (serviceType.IsAbstract || serviceType.IsInterface){ 
     return null; 
     } 
    } 
    return container.Resolve(serviceType); 
    } 

CourseServiceコンクリートCourseRepositoryに依存していると言うならばそのように、コンテナはそれをインスタンス化します。

私は、階層のどこかにタイプの登録がないことや、具体化されていない具体的なタイプへの依存があると仮定してDanHと一緒にいます。

私はこれと同じ問題があったが、次の記事が役に立ったと評価:

http://xhalent.wordpress.com/2011/01/17/using-unity-as-a-dependency-resolver-asp-net-mvc-3/

関連する問題