zoukankan      html  css  js  c++  java
  • Autofac 的属性注入方式

    介绍

    该篇文章通过一个简单的 ASP.NET MVC 项目进行介绍如何使用 autofac 及 autofac 的 MVC 模块进行依赖注入。注入方式通过构造函数。在编写 aufofac 的依赖注入代码之前先准备一些基础类。

    基础类

    public class UserInfo
    {
        public int Id { get; set; }
    
        public string Name { get; set; }
    }
    public interface IRepository<T>
    {
        void Add( T item );
    
        void Modifty( T item );
    
        List<T> Find( Expression<Func<T, bool>> predicate = null );
    }
    public interface IProductRepository:IRepository<ProductInfo>
    {
    
    }
    public class ProductRepository : IProductRepository
    {
        private static List<ProductInfo> _products = new List<ProductInfo>();
    
        public void Add( ProductInfo item )
        {
            _products.Add( item );
        }
    
        public List<ProductInfo> Find( Expression<Func<ProductInfo, bool>> predicate = null )
        {
            if ( predicate == null ) return _products;
    
            return _products.Where( predicate.Compile() ).ToList();
        }
    
        public void Modifty( ProductInfo item )
        {
            var product = _products.Find( u => u.Id == item.Id );
    
            if ( product == null ) return;
    
            product.Name = item.Name;
        }
    } 
    public interface IAppService<T>
    {
        void Add( T item );
    
        void Modify( T item );
    
        List<T> Find( Expression<Func<T, bool>> predicate = null );
    }
    public interface IProductAppService:IAppService<ProductInfo>
    {
    
    }
    public class ProductAppService : IProductAppService
    {
        public IProductRepository ProductRepository { get; set; }
    
        public void Add( ProductInfo item )
        {
            this.ProductRepository.Add( item );
        }
    
        public List<ProductInfo> Find( Expression<Func<ProductInfo, bool>> predicate = null )
        {
            return this.ProductRepository.Find( predicate );
        }
    
        public void Modify( ProductInfo item )
        {
            this.ProductRepository.Modifty( item );
        }
    } 
    public class ProductController : Controller
    {
        public IProductAppService ProductService { get; set; }
    
        public ActionResult Index()
        {
            this.ProductService.Add( new ProductInfo { Id = 1, Name = "Lumia" } );
    
            return View("~/Views/Product/Index.cshtml");
        }
    } 

    属性注入代码

    以下代码中 PropertiesAutowired() 方法就是实现了属性注入的核心,从单词字面意思就可以看出其用意。

    private void _InitIoC()
    {
        var builder = new ContainerBuilder();
    
        builder.RegisterControllers( typeof( MvcApplication ).Assembly )
            .PropertiesAutowired();
        builder.RegisterAssemblyTypes( typeof( MvcApplication ).Assembly )
            .Where( t => (t.Name.EndsWith( "Repository" ) || t.Name.EndsWith("AppService")) && !t.IsAbstract )
            //.InstancePerDependency()    //每次都创建一个对象
            //.SingleInstance()   //每次都是同一个对象
            //.InstancePerLifetimeScope()     //同一个生命周期生成的对象是同一个
            .InstancePerRequest()   //单个 Web / HTTP / API 请求的范围内的组件的共享一个实例。仅可用于支持每个请求的依赖关系的整合(如MVC,Web API,Web Forms等)。
            .AsImplementedInterfaces()
            .PropertiesAutowired();
    
        var container = builder.Build();
        var resolver = new AutofacDependencyResolver( container, new StubLifetimeScopeProvider( container ) );
                
        DependencyResolver.SetResolver( resolver );
    } 

    其它

    Autofac.dll 版本 3.4.0.0
    Autofac.Integration.Mvc.dll 版本 3.3.4.215

    本博客内容,如需转载请务必保留超链接。

    Contact Me:Mail此处省略好几个字...
  • 相关阅读:
    java 上传图片
    getElementById 鼠标经过字体改变颜色
    getElementById 学习
    css的绝对定位与相对定位
    关于For循环
    扩展方法的应用
    关于Function 的学习笔记
    <a>标签中查找文件的方法
    关于Name ID class属性的区别
    使用float设置经典的网站前端结构
  • 原文地址:https://www.cnblogs.com/jroger/p/4740574.html
Copyright © 2011-2022 走看看