using Autofac;
using Autofac.Integration.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace FineAdmin.Web
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            RemoveWebFormEngines();

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //����autofac����ע���������ʵ��
            var builder = new ContainerBuilder();
            SetupResolveRules(builder);
            //ʹ��Autofac�ṩ��RegisterControllers��չ�������Գ��������е�Controllerһ���Ե����ע�� ֧������ע��
            builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();

            // ������װ�뵽΢��Ĭ�ϵ�����ע��������
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }

        private static void SetupResolveRules(ContainerBuilder builder)
        {
            //WebAPIֻ������services��repository�Ľӿڣ���������ʵ�ֵ�dll��
            //�������ʵ�ֵij��򼯣���dll������binĿ¼�¼��ɣ���������dll
            var iServices = Assembly.Load("FineAdmin.IService");
            var services = Assembly.Load("FineAdmin.Service");
            var iRepository = Assembly.Load("FineAdmin.IRepository");
            var repository = Assembly.Load("FineAdmin.Repository");

            //��������Լ���������Ľӿں�ʵ�־���Services��β����ʵ�ַ���ӿںͷ���ʵ�ֵ�����
            builder.RegisterAssemblyTypes(iServices, services)
              .Where(t => t.Name.EndsWith("Service"))
              .AsImplementedInterfaces().PropertiesAutowired();

            //��������Լ�������ݷ��ʲ�Ľӿں�ʵ�־���Repository��β����ʵ�����ݷ��ʽӿں����ݷ���ʵ�ֵ�����
            builder.RegisterAssemblyTypes(iRepository, repository)
              .Where(t => t.Name.EndsWith("Repository"))
              .AsImplementedInterfaces().PropertiesAutowired();
        }

        /// <summary>
        /// �Ƴ�webform��ͼ����
        /// </summary>
        void RemoveWebFormEngines()
        {
            var viewEngines = ViewEngines.Engines;
            var webFormEngines = viewEngines.OfType<WebFormViewEngine>().FirstOrDefault();
            if (webFormEngines != null)
            {
                viewEngines.Remove(webFormEngines);
            }
        }

    }
}