DI 依賴注入之StructureMap框架

DI  依賴注入之StructureMap框架web

一.簡敘:api

structureMap只是DI框架中的其中之一。mvc

二.安裝及使用:框架

1.懶人方法:this

使用MVC5項目時,能夠直接在nuget程序包中安裝StructureMap.MVC5;(根據本身的mvc版本安裝對應的)spa

使用webapi項目時,能夠直接在nuget程序包中安裝StructureMap.WebApi2code

 public class DefaultRegistry : Registry
    {
        #region Constructors and Destructors

        public DefaultRegistry()
        {
            Scan(
                scan =>
                {
                    scan.TheCallingAssembly();
                    scan.WithDefaultConventions();
                });
            //For<IExample>().Use<Example>();
            For<AWSW.IDAL.IUserDAL>().Use<AWSW.DAL.UserDAL>();
            For<AWSW.IBLL.IUserBLL>().Use<AWSW.BLL.UserBLL>();
        }

        #endregion
    }

2.勤快人方法:(手動須要寫幾個類)blog

經過nuget方式安裝structureMap框架,版本根據本身的項目須要選擇。接口

(1)建立容器:get

 public class IoC
    {
        public static IContainer Initialize()
        {
            return new Container(x =>
            {
                x.AddRegistry<DefaultRegistry>();
            });
        }
    }

(2)註冊:

public class DefaultRegistry : Registry
    {
        public DefaultRegistry()
        {
            Scan(x =>
            {
                x.TheCallingAssembly();
                x.WithDefaultConventions();
            });
            For<IUserDAL>().Use<UserDAL>();
            For<IUserBLL>().Use<UserBLL>();
        }
    }

(3)調用:(global.asax文件中調用來初始化容器)

 var container = IoC.Initialize();

【到此步,在沒有使用mvc或webapi項目的時候已經完了】

(4)mvc使用

SetResoler參數是實現IDependencyResolver的類,因此咱們寫個實現它的類,實現便可

DependencyResolver.SetResolver(new MVCStructureMapDependencyResolver(container));

實現IDependencyResolver接口的類

public class MVCStructureMapDependencyResolver : IDependencyResolver
    {
        IContainer _container;
        public MVCStructureMapDependencyResolver(IContainer container)
        {
            this._container = container;
        }
        public object GetService(Type serviceType)
        {
            try
            {
                return this._container.GetInstance(serviceType);
            }
            catch (Exception)
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return this._container.GetAllInstances(serviceType).Cast<object>();
            }
            catch (Exception)
            {
                return null;
            }
        }
    }

 

(5)webapi使用:

DependencyResolver的屬性須要一個實現IDependencyResolver接口類,而且IDependencyResolver接口內BeginScope的方法返回值又是個接口IDependencyScope,因而還得去實現它。就有了以下的代碼:

GlobalConfiguration.Configuration.DependencyResolver = new WebApiStructureMapDependencyResolver(container);
public class WebApiStructureMapDependencyResolver : WebApiStructureMapDependencyScope, IDependencyResolver
    {
        IContainer container;
        public WebApiStructureMapDependencyResolver(IContainer container) : base(container)
        {
            this.container = container;
        }

        IDependencyScope IDependencyResolver.BeginScope()
        {
            return new WebApiStructureMapDependencyScope(container);
        }
    }

    public class WebApiStructureMapDependencyScope : IDependencyScope
    {
        IContainer container;
        public WebApiStructureMapDependencyScope(IContainer container)
        {
            this.container = container;
        }

        public void Dispose()
        {
            this.container.Dispose();
        }

        public object GetService(Type serviceType)
        {
            try
            {
                return container.GetInstance(serviceType);
            }
            catch (Exception)
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return container.GetAllInstances(serviceType).Cast<object>();
            }
            catch (Exception)
            {
                return null;
            }
        }
    }
相關文章
相關標籤/搜索