1

Unity IoC コンテナーを ASP.NET mvc4 アプリケーションにセットアップしようとしています。空のプロジェクトを作成し、パッケージ管理コンソールを使用して次の製品をインストールしました

  • インストール パッケージ Unity
  • インストール パッケージ Unity.Mvc4

すべてが正常に終了しました。しかし、アプリケーションを実行した後、例外があります

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。例外の詳細: System.MissingMethodException: インターフェイスのインスタンスを作成できません。

ここに簡単なコードがあります。Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        Bootstrapper.Initialise();
    }
}

public interface IA
{
    void test();
}
public class A : IA
{
    public A() { }
    public void test()
    {
        throw new NotImplementedException();
    }
}

HomeController.cs

public class HomeController : Controller
{
    //
    // GET: /Home/

    public ActionResult Index(IA a)
    {
        return View();
    }

}

Bootstrapper.cs:

public static class Bootstrapper
{
    public static void Initialise()
    {
        var container = BuildUnityContainer();

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

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();

        container.RegisterType<IA, A>();          

        return container;
    }
}

何が間違っているのか、コードが機能しないのはなぜですか?

スタックトレース:

スタック トレース: [MissingMethodException: インターフェイスのインスタンスを作成できません。] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,ブールskipCheckThis、ブールfillCache) +98 System.RuntimeType.CreateInstanceDefaultCtor(ブールpublicOnly、ブールskipVisibilityChecks、ブールskipCheckThis、ブールfillCache) +241 System.Activator.CreateInstance(型タイプ、ブールnonPublic) +69 System.Web.Mvc.DefaultModelBinder。 CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +199 System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext,ModelBindingContext bindingContext) +572 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext、ModelBindingContext bindingContext) +454 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext、ParameterDescriptor parameterDescriptor) +317 System.Web.Mvc.ControllerActionInvoker.GetParameterValues (ControllerContext controllerContext、ActionDescriptor actionDescriptor) +117 System.Web.Mvc.Async.<>c_GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +117 System.Web.Mvc.Async.<>c_GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +117 System.Web.Mvc.Async.<>c_DisplayClass25.b _1e(AsyncCallback asyncCallback、オブジェクト asyncState) +476 System.Web.Mvc.Async.WrappedAsyncResult 1.Begin(AsyncCallback callback, Object state, Int32 timeout) +124 System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +304 System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback コールバック、オブジェクト状態、Int32 タイムアウト) +124 System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback コールバック、オブジェクトの状態) +389 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback callback, Object state, Int32 timeout) +124 System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +319 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15 System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +76 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback コールバック、オブジェクト状態、Int32 タイムアウト) +124 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext、AsyncCallback コールバック、オブジェクト状態) +251 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext、AsyncCallbackコールバック、オブジェクト状態) +50 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext コンテキスト、AsyncCallback cb、オブジェクト extraData) +16 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute( ) +8837208 System.Web.HttpApplication.ExecuteStep(IExecutionStep ステップ、ブール値 & completedSynchronously) +184

4

1 に答える 1

4

あなたの何が問題なのか正確にはわかりませんが、これが私にとってうまくいく設定です。

public static class Bootstrapper
{
    public static void Initialise()
    {
        var container = BuildUnityContainer();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
        container.RegisterType<ICategoryRepository, CategoryRepository>(new HierarchicalLifetimeManager());
        return container;
    }
}

Global.asax

 Bootstrapper.Initialise();

今、私のコントローラーコンストラクターで;

ICategoryRepository _catRepo;

public CategoryController(ICategoryRepository catRepo)
{
    _catRepo = catRepo;
}
public ActionResult Index()
{
    ViewBag.CategoriesList = _catRepo.GetAllCategories();
    return View();
}
于 2013-04-06T12:00:45.010 に答える