zoukankan      html  css  js  c++  java
  • 痛快-IoC

    IoC的好处

    降低耦合,提高开发效率

    实现代码

    首先加入微软示例中的两个类

    namespace TongKuai.IoC
    {
        /// <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)
            {
                var fileMap = new ExeConfigurationFileMap()
                {
                    ExeConfigFilename = HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["UnityConfigPath"])
                };
                Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
                var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");
                container.LoadConfiguration(unitySection, "TKContainer");
            }
        }
    }
    namespace TongKuai.IoC
    {
        /// <summary>Provides the bootstrapping for integrating Unity with ASP.NET MVC.</summary>
        public static class UnityWebActivator
        {
            /// <summary>Integrates Unity when the application starts.</summary>
            public static void Start()
            {
                var container = UnityConfig.GetConfiguredContainer();
    
                FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
                FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));
    
                DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    
                // TODO: Uncomment if you want to use PerRequestLifetimeManager
                // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
            }
        }
    }

    新建配置文件Unity.config

    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
      </configSections>
      <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
        <typeAliases>
          <typeAlias  alias="IProduct" type="MvcApplication2.IBLL.IProduct, MvcApplication2.IBLL" />
          <typeAlias  alias="Product" type="MvcApplication2.BLL.Product, MvcApplication2.BLL" />
        </typeAliases>
        <containers>
          <container name="TKContainer">
            <register type="IProduct" mapTo="Product"/>
          </container>
        </containers>
      </unity>
    </configuration>

    最后实现类

    namespace TongKuai.IoC
    {
        /// <summary>
        /// IoC操作类
        /// </summary>
        public static class IoCHelper
        {
            public static IUnityContainer container = UnityConfig.GetConfiguredContainer();
    
            [DebuggerStepThrough]
            public static T Resolve<T>()
            {
                return container.Resolve<T>();
            }
    
            [DebuggerStepThrough]
            public static T Resolve<T>(string name)
            {
    
                return container.Resolve<T>(name);
            }
    
            [DebuggerStepThrough]
            public static IEnumerable<T> ResolveAll<T>()
            {
                return container.ResolveAll<T>();
            }
        }
    }

    我们在MVC中注册

            protected void Application_Start()
            {
                IoC.UnityWebActivator.Start();
    
                AreaRegistration.RegisterAllAreas();
    
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                AuthConfig.RegisterAuth();
            }

    到此为止可以实现了IoC

    调用方法

    private readonly IProduct product = IoC.IoCHelper.Resolve<IProduct>();

            private readonly IProduct product;
    
            public HomeController(IProduct product)
            {
                this.product = product;
            }

    之前我们用Unity来IoC时需要自写Controller注入,现在微软出了Microsoft.Practices.Unity.Mvc后完全不需要了,简单代码就可以实现

    这里我们用到了微软企业库中的:

                           Microsoft.Practices.Unity.Mvc  

                           Microsoft.Practices.Unity

                           Microsoft.Practices.Unity.Configuration

  • 相关阅读:
    重大利好,Dubbo 3.0要来了。
    SaaS,PaaS,IaaS都是什么鬼?
    为什么Netty这么火?与Mina相比有什么优势?
    (21)python lambda表达式
    (19)python scrapy框架
    (18) python 爬虫实战
    (5)ASP.NET HTML服务器控件
    (17)python Beautiful Soup 4.6
    (4)ASP.NET内置对象1
    (16)网络爬虫
  • 原文地址:https://www.cnblogs.com/tongkuai/p/3233876.html
Copyright © 2011-2022 走看看