zoukankan      html  css  js  c++  java
  • MVC IOC 依赖注入


    需要引用如下:
    IDependencyResolver->System.Web.Mvc.dll
    IUnityContainer->Microsoft.Practices.Unity.dll

    Global.asax 追加如下方法


    protected void
    Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); Initialise(); } public void Initialise() { IUnityContainer container = BuildUnityContainer(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); } private IUnityContainer BuildUnityContainer() { var container = new UnityContainer(); container.RegisterType<IOrderBiz, BookingGroupOrderBiz>("BookingGroupOrder"); container.RegisterType<IOrderBiz, GroupOrderBiz>("GroupOrder"); container.RegisterType<IPageDataBiz,GroupOrderPageDataBiz>(); return container; }
    public class UnityDependencyResolver : IDependencyResolver
        {
            private const string HttpContextKey = "perRequestContainer";
    
            private readonly IUnityContainer _container;
    
            public UnityDependencyResolver(IUnityContainer container)
            {
                _container = container;
            }
    
            public object GetService(Type serviceType)
            {
                if (typeof(IController).IsAssignableFrom(serviceType))
                {
                    return ChildContainer.Resolve(serviceType);
                }
    
                return IsRegistered(serviceType) ? ChildContainer.Resolve(serviceType) : null;
            }
    
            public IEnumerable<object> GetServices(Type serviceType)
            {
                if (IsRegistered(serviceType))
                {
                    yield return ChildContainer.Resolve(serviceType);
                }
    
                foreach (var service in ChildContainer.ResolveAll(serviceType))
                {
                    yield return service;
                }
            }
    
            protected IUnityContainer ChildContainer
            {
                get
                {
                    var childContainer = HttpContext.Current.Items[HttpContextKey] as IUnityContainer;
    
                    if (childContainer == null)
                    {
                        HttpContext.Current.Items[HttpContextKey] = childContainer = _container.CreateChildContainer();
                    }
    
                    return childContainer;
                }
            }
    
            public static void DisposeOfChildContainer()
            {
                var childContainer = HttpContext.Current.Items[HttpContextKey] as IUnityContainer;
    
                if (childContainer != null)
                {
                    childContainer.Dispose();
                }
            }
    
            private bool IsRegistered(Type typeToCheck)
            {
                var isRegistered = true;
    
                if (typeToCheck.IsInterface || typeToCheck.IsAbstract)
                {
                    isRegistered = ChildContainer.IsRegistered(typeToCheck);
    
                    if (!isRegistered && typeToCheck.IsGenericType)
                    {
                        var openGenericType = typeToCheck.GetGenericTypeDefinition();
    
                        isRegistered = ChildContainer.IsRegistered(openGenericType);
                    }
                }
    
                return isRegistered;
            }
        }  


    IOC 无需知道接口的实现,为BIZ业务类解耦。
    可以在构造函数里面注入,也可以在属性里面注入,需要追加Dependency特性。
    详细说明请参照 http://www.cnblogs.com/techborther/archive/2012/01/06/2313498.html

    使用方法如下:


    public class
    GroupOrderController : BaseController { #region ///按照业务线划分 /// <summary> /// 非Booking酒店 类 /// </summary> [Dependency("GroupOrder")] public IOrderBiz COBiz { get; set; } /// <summary> /// Booking酒店 类 /// </summary> [Dependency("BookingGroupOrder")] public IOrderBiz BCOBiz { get; set; } /// <summary> /// 页面数据 /// </summary> [Dependency] public IPageDataBiz GroupPageData { get; set; }
      public ActionResult Index(int id)
      {
          return View();
      }
    }
  • 相关阅读:
    npm ERR! code ELIFECYCLE
    typescript react echarts map geojson
    react ts could not find a declaration file for module
    SQL SERVER 查询存储过程执行时间
    分析云优化方案
    U8 单据弃审失败 解决办法
    RCP的熔断,降级与限流(笔记五)
    RPC的优雅关闭(笔记四)
    RCP的请求路由(笔记三)
    RCP的负载均衡(笔记二)
  • 原文地址:https://www.cnblogs.com/kfsmqoo/p/3995119.html
Copyright © 2011-2022 走看看