代码改变世界

Dapper

2016-12-19 14:27  只喝牛奶的杀手  阅读(1169)  评论(2编辑  收藏  举报

前一段做一个技术分享关于dapper的,现在再总结一下,也好长时间没有更新博客了……,用到的东西 Dapper、AutoFac 、AutoMapper、FluentValidation;

下面说一下Dapper的优点:

Dapper是一个轻型的开源ORM类,代码就一个SqlMapper.cs文件,编译后就40多K的一个很小的Dll.

Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如果你知道原理也可以让它支持Mongo db

Dapper的r支持多表并联的对象。支持一对多 多对多的关系。并且没侵入性,想用就用,不想用就不用。无XML无属性。代码以前怎么写现在还怎么写。

Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。性能提升了很多;(比采用常规的反射)

Dapper支持net2.0,3.0,3.5,4.0。不过就是要配置下。如果不知道如何配置查看我博客里的在2.0下使用3.5就可以了。

语法十分简单。并且无须迁就数据库的设计。

 官网上给的AutoMapper解释,我翻译了一下:

AutoMapper is a simple little library built to solve a deceptively complex problem - getting rid of code that mapped one object to another. 

AutoMapper 是代码的一个简单的小库建立解决看似复杂的问题-摆脱映射到另一个对象。

  官网上给的Autofac 解释,我又翻译了一下:

Autofac is an addictive IoC container for Microsoft .NET 4.5, Silverlight 5, Windows Store apps, and Windows Phone 8 apps. It manages the dependencies between classes so that applications stay easy to change as they grow in size and complexity. This is achieved by treating regular .NET classes as components.

Autofac 是入迷的 IoC 容器为 Microsoft.NET 4.5、 Silverlight 5、 Windows 应用商店应用程序,Windows Phone 8 应用程序。它管理类之间的依赖关系,以便应用程序保持容易改变,因为他们都生长在规模和复杂性。这被通过定期的.NET 类当作组件。

FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开来的验证方式,同时FluentValidation还提供了表达式链式语法。

为什么用FV不用属性注解的方式,只是想把Model和验证分开,做到解耦。

 依赖注入的方法有属性注入、构造函数注入、接口注入,具体依赖注入是什么,最后我会把技术分享的PPT加到附件里面,大家可以详细的看一下;

在Global里面注册AutoFac

public static void  CoreAutoFacInit()
        {
            #region Autofac 注入依赖
            var builder = new ContainerBuilder();
            SetupResolveRules(builder);
            builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();

            //注册Filter过滤器
            //builder.RegisterFilterProvider();
           
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
         
            #endregion 
       
            // Set up the FluentValidation provider factory and add it as a Model validator
            //var factory = new FluentValidatorFactory();
            //ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(factory));
            FluentValidationModelValidatorProvider.Configure(provider =>
            {
                provider.ValidatorFactory = new FluentValidatorFactory();
                provider.AddImplicitRequiredValidator = false;

                provider.Add(typeof(UniqueEmailValidator), (metadata, context, description, validator) => new UniqueEmailPropertyValidator(metadata, context, description, validator));
            });
            DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
            ValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="builder"></param>
        private static void SetupResolveRules(ContainerBuilder builder)
        {
            var assemblyRepository = Assembly.Load("GkmDapper.Repository");
            var assemblyBLL = Assembly.Load("GkmDapper.BLL");
            builder.RegisterAssemblyTypes(assemblyRepository).Where(type => type.Name.EndsWith("Repository") && type.Namespace.Equals("GkmDapper.Repository.SqlServerRepository"))
                .AsImplementedInterfaces().SingleInstance();
            builder.RegisterAssemblyTypes(assemblyBLL).Where(type => type.Name.EndsWith("BLL") && type.Namespace.Equals("GkmDapper.BLL.SqlServerBLL"))
                .AsImplementedInterfaces().SingleInstance();

            //将自定义FluentValidate加入IOC容器(程序集扫描)
            AssemblyScanner.FindValidatorsInAssemblyContaining<CustomerValidator>().ForEach(x => builder.RegisterType(x.ValidatorType)
                .As(x.InterfaceType).SingleInstance());
        }

同样AutoMapper也需要注册

 public static void RegisterMaps()
        {
            AutoMapper.Mapper.Initialize(config =>
            {
                config.CreateMap<CustomerViewModel, Customer>();
            });
        }

  

 这是一篇未写完的博客,还是发表了吧。如果谁对Dapper+automapper+FluentValidation这套架构感兴趣的话,可以联系我,技术转型,不再更新关于.NET的东西。