2

現在のプロジェクトはMvc4アプリケーションです。私は、Iocを動作させていましたが、最近停止しました。

DependencyResolver.SetResolver(New UnityDependencyResolver(RegisterIocServices()))

その行は機能していましたが、次のエラーが発生します。

ArgumentExceptionはユーザーコードによって処理されませんでした

タイプUnity.Mvc3.UnityDependencyResolverは、Microsoft.Practices.ServiceLocation.IServiceLocatorを実装していないようです。パラメータ名:commonServiceLocator

これを経験している人はいますか?何か考えやアドバイスはありますか?

前もって感謝します。

4

3 に答える 3

3

MVC4.0で

私が抱えていた問題は、IDependencyResolverに2つのバージョンがあることでした

 //using System.Web.Http.Dependencies;  //wrong version for me

 using System.Web.Mvc; //correct version for me.

System.Web.Mvcの使用は、WebAPIプロジェクトで必要なバージョンでした。

私は団結を使用していますが、以下のブログ投稿は私が問題をまっすぐに理解するのに役立ちます。

http://www.strathweb.com/2012/05/using-ninject-with-the-latest-asp-net-web-api-source/

于 2012-08-21T19:58:35.210 に答える
1

Unity MVCパッケージをアンインストール/再インストールしても、問題は解決しませんでした。プロジェクトにMicrosoft.EnterpriseLibrary.Commonライブラリへのハードリファレンスを配置する必要があり、それで1〜2週間はクリアされたようです。その後、エラーが断続的に再発するのを確認し始めました。完全なソリューションをクリーンアップしてビルドすると、たまに問題が解決しました。それは機能し、その後突然エラーメッセージに戻ります。

それで、私はついに今朝Unity.Mvcをあきらめ、代わりにAutofacを実装しました。Autofac用にブートストラッパーファイルを設定すると、最初のコンパイルで動作し、午前中は安定しています。

誰かがサンプルを必要とする場合に備えて、Autofacのブーストラッパーファイルを次に示します。注:Global.asax.vbファイルに大量のコードを配置する代わりに、WebActivatorを使用して、すべてのブートスラップクラスを起動前に実行します。

#Region "Imports"

Imports System.Reflection
Imports Autofac
Imports Autofac.Integration.Mvc
Imports MyCompany.Data.Repositories
Imports MyCompany.Services
Imports MyCompany.Web.Mvc.Public.Bootstrap
Imports MyCompany.Web.Mvc.Public.Services

#End Region

#Region "Assembly Meta"

' This tells the app to run the "Start" method prior to running the App_Start method in Global.asax
<Assembly: WebActivator.PreApplicationStartMethod(GetType(AutofacDI), "Initialize")> 

#End Region

Namespace MyCompany.Web.Mvc.Public.Bootstrap

    ''' <summary>
    ''' Class to setup dependency injection and register types/services.
    ''' </summary>
    ''' <remarks></remarks>
    Public NotInheritable Class AutofacDI

        ''' <summary>
        ''' Method to register the Unity dependency injection component.
        ''' </summary>
        ''' <remarks>
        ''' This line of code below could alternatively be placed in Global.asax App_Start(), doing
        ''' so in this manner ensures that this gets run "PreStart".
        ''' </remarks>
        Public Shared Sub Initialize()

            ' Create Unity dependency container.
            Dim dependencyContainer = BuildIocContainer()

            ' Set DI resolver
            DependencyResolver.SetResolver(New AutofacDependencyResolver(dependencyContainer))

        End Sub

        ''' <summary>
        ''' Registers the IOC types/services.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Shared Function BuildIocContainer() As Autofac.IContainer

            Dim builder = New ContainerBuilder

            With builder
                ' Register Controllers
                .RegisterControllers(Assembly.GetExecutingAssembly())

                ' Custom MyCompany/Mvc objects
                .RegisterType(Of FormsAuthenticationService)().As(Of IFormsAuthenticationService)().InstancePerHttpRequest()
                .RegisterType(Of AccountMembershipService)().As(Of IMembershipService)().InstancePerHttpRequest()

                '***************************************************************
                '*  MyCompany service objects.
                '***************************************************************
                ' This is auto registration, it replaces all the individual registration lines of code below.
                builder.RegisterAssemblyTypes(GetType(CatalogCodeService).Assembly).
                    Where(Function(t) t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest()

                '***************************************************************
                '*  MyCompany repository objects (used by service objects above)
                '***************************************************************
                ' This is auto registration, it replaces all the individual registration lines of code below.
                builder.RegisterAssemblyTypes(GetType(CatalogCodeRepository).Assembly).
                    Where(Function(t) t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerHttpRequest()
            End With

            Return builder.Build()

        End Function

    End Class

End Namespace
于 2012-05-25T14:59:56.963 に答える
0

この特定の質問に対する答えではありませんが、上記のエラーメッセージも受信していました。この質問は、そのメッセージをグーグルで検索したときの最初のヒットです。この問題が発生したSystem.Web.Mvc.DependencyResolverのは、インターフェイスを実装するだけの場合、代わりに愚かな継承を行ったためです。例:

// wrong
public class MyDependencyResolver : System.Web.Mvc.DependencyResolver
{ ... }

// correct
public class MyDependencyResolver : System.Web.Mvc.IDependencyResolver
{ ... }

これを解決するのに少し時間がかかりましたので、これが他の誰かのトラブルを救うことを願っています。

于 2013-02-21T03:39:06.503 に答える