实战Angular2+web api增删改查 (二)

webapi配置

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            //SwaggerConfig.Register();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            //Nhibernate及日志初始化
            LoggingConfig.Register();
            //依赖注入初始化
            IocConfig.Register();
            
        }

在Global.asax的启动方法中加入依赖注入的配置,NHibernate配置,以及webapi配置,区域路由配置等,如果使用安全策略也许要在此加入,本例目前还没进行身份认证处理,后面将会重点介绍。

 

AutoFac依赖注入配置

public static void Register()
        {
            ContainerBuilder builder = new ContainerBuilder();
 
            Type baseType = typeof(IDependency);
            var assemblies = AppDomain.CurrentDomain.GetAssemblies();
            // 获取所有相关类库的程序集
            
 
            builder.RegisterAssemblyTypes(assemblies)
                .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();
            
            var config = GlobalConfiguration.Configuration;
 
 
            builder.RegisterWebApiFilterProvider(config);
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
 
            //builder.RegisterType<GroupListController>().InstancePerRequest();
            
            var container = builder.Build();
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        }

这个配置可以看出是利用反射技术获取当前应用下的所有assemblies ,通过Type baseType = typeof(IDependency)指定凡是继承该接口的实例都将注入到ContainerBuilder 容器中。

除此之外,要在wabapi中使用依赖注入还需处理webapi的注入,这就需要使用另一个工具Autofac.WebApi,使用PM > Install-Package Autofac.WebApi获取。然后使用config.DependencyResolver = new AutofacWebApiDependencyResolver(container)就可将webapicontroller注入到容器中。

NHibernate配置

public class LoggingConfig
   {
       public static void Register()
       {
           SessionBuilder.Instance("web");
           string logfile = CachedConfigContext.Current.ConfigService.GetFilePath("log4net");
 
           var ms = new MemoryStream(Encoding.Default.GetBytes(logfile));
           log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(logfile));
       }
   }

这里我还是用了log4net加入了log功能,这里注意SessionBuilder.Instance("web");由于我们开发的是webapi应用所以这里实例话是选择为web。这里的SessionBuilder是前面封装的对Nhibernate的ISession管理的类。

Web Api跨域访问配置

Web api跨越访问需要使用另外一个工具

PM>install-package Microsoft.AspNet.WebApi.Cors

global中的webapi register中增加

var cors = newEnableCorsAttribute(

            origins: "*",

            headers: "*",

            methods: "*");

        config.EnableCors(cors);

 

public static class WebApiConfig
   {
       public static void Register(HttpConfiguration config)
       {
           // Web API 跨域访问
           var cors = new EnableCorsAttribute(
           origins: "*",
           headers: "*",
           methods: "*");
           config.EnableCors(cors);
 
           // Web API 路由
           config.MapHttpAttributeRoutes();
 
           config.Routes.MapHttpRoute(
               name: "DefaultApi",
               routeTemplate: "api/{controller}/{id}",
               defaults: new { id = RouteParameter.Optional }
           );
       }
   }

 

 

Web api Controller

[EnableCors("*""*""*")]
    public class GroupListController : ApiController
    {
        private IGroupService _groupService;
        public GroupListController(IGroupService groupService)
        {
            _groupService = groupService;
        }
        public IList<GroupBaseDto> GetAll()
        {
           var list =  _groupService.GetAll();
           List<GroupBaseDto> groupList =AutoMapperHelper.MapToList<GroupBaseDto>(list);
           return groupList;
 
        }
        public GroupBaseDto GetByID(string id)
        {
            var item = _groupService.GetByID(id);
            GroupBaseDto groupdto = AutoMapperHelper.MapTo<GroupBaseDto>(item);
            return groupdto;
 
        }
        public HttpResponseMessage PostGroup(GroupBaseDto group)
        {
            try
            {
                group.ID = Guid.NewGuid().ToString();
                TGroup entity = AutoMapperHelper.MapTo<TGroup>(group);
                _groupService.Add(entity);
                return new HttpResponseMessage(HttpStatusCode.NoContent);
            }
            catch
            {
                throw new HttpResponseException(HttpStatusCode.InternalServerError);
            }
        }
        public HttpResponseMessage PutGroup(string id, GroupBaseDto group)
        {
            try
            {
                group.ID = id;
                TGroup entity = AutoMapperHelper.MapTo<TGroup>(group);
                _groupService.Update(entity);
                return new HttpResponseMessage(HttpStatusCode.NoContent); 
            }
            catch(Exception se)
            {
                throw new  HttpResponseException(HttpStatusCode.InternalServerError); 
            }
        }
        public HttpResponseMessage DeleteGroup(string id)
        {
            
            try
            {
 
                 _groupService.Delete(id);
                 return new HttpResponseMessage(HttpStatusCode.NoContent); 
            }
            catch
            {
                throw new HttpResponseException(HttpStatusCode.InternalServerError);
            }
        }
    }

这里看到通过使用了前面webapi的依赖注入配置,我们在controller的构造函数中就可以使用构造注入Iservice了。这里也可以看到我们的数据传递使用了DTO,一方面是为了效率只传输与业务有关的数据,另一方面业务为了不暴露我们的数据属性。

public class GroupBaseDto
   {
       public virtual string ID { getset; }
       public virtual string GROUPNAME { getset; }
       public virtual decimal? NORDER { getset; }
       public virtual string PARENTID { getset; }
       public virtual string GROUPTYPE { getset; }
       public virtual string GROUPCODE { getset; }
   }

为了简单,这个实例我所使用DTO与我所在的领域模型一致,这里还是用了一个AutoMapper工具,Automapper能够让我们在DTO与DO的转换过程更简单了,下面是对AutoMapper的一个封装类,用于处理常用转换。

/// <summary>
    /// AutoMapper扩展帮助类
    /// </summary>
    public static class AutoMapperHelper
    {
        /// <summary>
        ///  类型映射
        /// </summary>
        public static T MapTo<T>(this object obj)
        {
            if (obj == nullreturn default(T);
            
            Mapper.Initialize(cfg=>cfg.CreateMap(obj.GetType(),typeof(T)));
            return Mapper.Map<T>(obj);
        }
        /// <summary>
        /// 集合列表类型映射
        /// </summary>
        public static List<TDestination> MapToList<TDestination>(this IEnumerable source)
        {
            foreach (var first in source)
            {
                var type = first.GetType();
                Mapper.Initialize(cfg => cfg.CreateMap(type, typeof(TDestination)));
                
                break;
            }
            return Mapper.Map<List<TDestination>>(source);
        }
        /// <summary>
        /// 集合列表类型映射
        /// </summary>
        public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source)
        {
            //IEnumerable<T> 类型需要创建元素的映射
            
            Mapper.Initialize(cfg => cfg.CreateMap(typeof(TSource), typeof(TDestination)));
            return Mapper.Map<List<TDestination>>(source);
        }
        /// <summary>
        /// 类型映射
        /// </summary>
        public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
            where TSource : class
            where TDestination : class
        {
            if (source == nullreturn destination;
            Mapper.Initialize(cfg => cfg.CreateMap(typeof(TSource), typeof(TDestination)));
            return Mapper.Map(source, destination);
        }
        
    }

到此我们一个简单的api就已经完成了,可以通过Swashbuckle 进行测试,安装PM> Install-Package Swashbuckle,使用时只需在路径后加入swagger,如http://localhost:6611/swagger/ui/index

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值