DI 依赖注入之StructureMap框架

DI  依赖注入之StructureMap框架

一.简叙:

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

二.安装及使用:

1.懒人方法:

使用MVC5项目时,可以直接在nuget程序包中安装StructureMap.MVC5;(根据自己的mvc版本安装对应的)

使用webapi项目时,可以直接在nuget程序包中安装StructureMap.WebApi2

复制代码
 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.勤快人方法:(手动需要写几个类)

通过nuget方式安装structureMap框架,版本根据自己的项目需要选择。

(1)创建容器:

复制代码
 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;
            }
        }
    }
复制代码

 

posted @   土豆哥  阅读(717)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2016-05-26 WeChat 微信公众号开发步骤
点击右上角即可分享
微信分享提示