簡體   English   中英

對Global.asax編譯的依賴項注入錯誤

[英]Dependency Injection on Global.asax compilation error

在global.asax中調用服務時出現編譯錯誤。 我使用UnityMvc作為我的DI。 在我的控制器中調用它時它正在工作,但在Global.asax中卻沒有。 這是錯誤。

編譯器錯誤消息:CS7036:沒有給出與“ MvcApplication.MvcApplication(IGenreService)”的所需形式參數“ genreService”相對應的參數

Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    private readonly IGenreService _genreService;

    public MvcApplication(IGenreService genreService)
    {
        _genreService = genreService;
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

GenreService.cs

public partial class GenreService : IGenreService
{
    private readonly IRepository<Genre> _genreRepository;
    private readonly IRepository<GameGenre> _gameGenreRepository;

    public GenreService(IRepository<Genre> genreRepository, IRepository<GameGenre> gameGenreRepository)
    {
        _genreRepository = genreRepository;
        _gameGenreRepository = gameGenreRepository;
    }

    // methods
}

IGenreService.cs

public partial interface IGenreService
{
    // interface
}

UnityConfig.cs

using System;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.Data.Entity;
using Microsoft.AspNet.Identity;
using Microsoft.Owin.Security;
using GameCommerce.Infrastructure.Services.GameLibrary;
using GameCommerce.Infrastructure;
using Microsoft.AspNet.Identity.EntityFramework;
using GameCommerce.Infrastructure.ApplicationUsers;
using System.Web;
using GameCommerce.Infrastructure.Services.Message;

namespace GameCommerce.Web.App_Start
{
/// <summary>
/// Specifies the Unity configuration for the main container.
/// </summary>
public class UnityConfig
{
    #region Unity Container
    private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
    {
        var container = new UnityContainer();
        RegisterTypes(container);
        return container;
    });

    /// <summary>
    /// Gets the configured Unity container.
    /// </summary>
    public static IUnityContainer GetConfiguredContainer()
    {
        return container.Value;
    }
    #endregion

    /// <summary>Registers the type mappings with the Unity container.</summary>
    /// <param name="container">The unity container to configure.</param>
    /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
    /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
    public static void RegisterTypes(IUnityContainer container)
    {
        // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
        // container.LoadConfiguration();

        // TODO: Register your types here
        // container.RegisterType<IProductRepository, ProductRepository>();

        container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
        container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
        container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new InjectionConstructor(new ApplicationDbContext()));
        container.RegisterType<Areas.Admin.Controllers.AccountController>(new InjectionConstructor());
        container.RegisterType<Controllers.AccountController>(new InjectionConstructor());
        container.RegisterType<IAuthenticationManager>(new InjectionFactory(o => HttpContext.Current.GetOwinContext().Authentication));

        container.RegisterType(typeof(IRepository<>), typeof(Repository<>));
        container.RegisterType<IGameService, GameService>();
        container.RegisterType<IGenreService, GenreService>();
        container.RegisterType<IGameDeveloperService, GameDeveloperService>();
        container.RegisterType<IGamePublisherService, GamePublisherService>();
        container.RegisterType<IMessageService, MessageService>();
    }
}
}

嘗試以下代碼:

using Microsoft.Practices.Unity;
public class MvcApplication : System.Web.HttpApplication
    {
        private readonly IGenreService _genreService;

        public MvcApplication()
        {
            _genreService = GameCommerce.Web.App_Start.UnityConfig.GetConfiguredContainer().Resolve<IGenreService>();
        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }

默認情況下,MVC中的DepedencyResolver用於控制器中的解析,因此在這里我們在“ MvcApplication”中使用顯式使用容器來解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM