7

Dependency injectionMVC アプリケーションに実装しようとしています。私はUnity.Mvc3.dllIoCに使用しています。Unity がどのようにして別のアセンブリからタイプを登録できないのか疑問に思っています。コードは次のとおりです。

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

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

    var container = new UnityContainer();

    // ok: register type from this assembly
    container.RegisterType<IMessages, Messages>();

    // fail: register type from another assembly (service reference)
    container.RegisterType<IPlayerService, PlayerService>();

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

public class UnityDependencyResolver : IDependencyResolver
{
    private readonly IUnityContainer _container;

    public UnityDependencyResolver(IUnityContainer container)
    {
        this._container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return _container.Resolve(serviceType);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return _container.ResolveAll(serviceType);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

MVC コントローラーでの使用法:

[Dependency]
public IPlayerService PlayerService { get; set; }

[Dependency]
public IMessages Messages { get; set; }


public ActionResult Index()
{
    PlayerMessageViewModel vm = new PlayerMessageViewModel();
    vm.Messages = Messages; // success!
    vm.Players = PlayerService.Get(); // fail: null reference exception :PlayerService

    return View(vm);
}

PlayerServiceMessages が OK の間は常に null です。

PlayerServiceクラスはこちら

public class PlayerService : IPlayerService
{
    private readonly MyDbEntities _dbContext;

    public PlayerService()
    {
        _dbContext = new MyDbEntities();
    }

    public PlayerService(MyDbEntities dbContext)
    {
        _dbContext = dbContext;
    }


    public IQueryable<Player> Get()
    {
        return _dbContext.Players.AsQueryable();
    }
}

これは完全なエラーメッセージです

依存関係の解決に失敗しました。タイプ = "System.Web.Mvc.IControllerFactory"、名前 = "(none)"。
例外が発生しました: 解決中。
例外は次のとおりです。 InvalidOperationException - 現在の型 System.Web.Mvc.IControllerFactory はインターフェイスであり、構築できません。タイプマッピングがありませんか?

4

4 に答える 4

7

すべての例外をcatch { return null; }非表示にして、それを削除して、解決中にスローされる例外を確認します。PlayerServiceコンストラクターで例外がスローされると思います。

編集:

http://mvchosting.asphostcentral.com/post/ASPNET-MVC-3-Hosting-Problem-in-implementing-IControllerActivator-in-ASPNET-MVC-3.aspxから

MVC アプリケーションが初めて開始されると、依存関係リゾルバーが次の型で次の順序で呼び出されます。

  • IControllerFactory
  • IControllerActivator
  • ホームコントローラー

型が登録されていない場合に null を返すようにリゾルバーを実装しなかった場合、おそらく次のようなエラーが表示されることになります。

現在の型 System.Web.Mvc.IControllerFactory はインターフェイスであり、構築できません

于 2012-06-12T06:28:16.550 に答える
7

デフォルトでは、ユニティは最も多くのパラメーターを持つコンストラクターを選択するため、解決できない dbContext パラメーターを持つ 2 番目のコンストラクターを使用しようとすると思います。デフォルトのコンストラクターを属性 [InjectionConstructor] でマークすると、問題が解決することを願っています

于 2012-06-12T08:12:21.427 に答える
2

の契約に違反していIDependencyResolverます。null解決できないタイプに対して返される必要があります。Unity の問題は、コンテナーに登録されているかどうかに関係なく、見つけられるすべてのクラスをビルドしようとすることです。

したがって、どこかにクラスを構築することはできません。

Unity.Mvc3nuget で利用可能なパッケージもあります。

于 2012-06-12T08:17:55.077 に答える
0

現在の型(EX-DI.IBLL.IEmployee)はインターフェイスであり、構築できません。タイプマッピングがありませんか?

回答-Unity.config.cs次のあなたを追加するだけです

public static class UnityConfig
    {
        public static void RegisterComponents()
        {
            var container = new UnityContainer();

            // register all your components with the container here
            // it is NOT necessary to register your controllers

            **container.RegisterType<IEmployee,EmployeeManager>();**
//this could be your interface and the class implementing the interface.

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        }
    }
于 2016-01-25T12:14:01.000 に答える