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

前端之家收集整理的这篇文章主要介绍了实战Angular2+web api增删改查 (二)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

webapi配置

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

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

AutoFac依赖注入配置

  1. publicstaticvoidRegister()
  1. {
  1. ContainerBuilderbuilder=newContainerBuilder();
  1. TypebaseType=typeof(IDependency);
  1. varassemblies=AppDomain.CurrentDomain.GetAssemblies();
  1. //获取所有相关类库的程序集
  1.  
  1. builder.RegisterAssemblyTypes(assemblies)
  1. .Where(type=>baseType.IsAssignableFrom(type)&&!type.IsAbstract)
  1. .AsImplementedInterfaces()
  1. .InstancePerLifetimeScope();
  1.  
  1. varconfig=GlobalConfiguration.Configuration;
  1.  
  1. builder.RegisterWebApiFilterProvider(config);
  1. builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
  1. //builder.RegisterType<GroupListController>().InstancePerRequest();
  1.  
  1. varcontainer=builder.Build();
  1. config.DependencyResolver=newAutofacWebApiDependencyResolver(container);
  1. }

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

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

NHibernate配置

  1. publicclassLoggingConfig
  1. {
  1. publicstaticvoidRegister()
  1. {
  1. SessionBuilder.Instance("web");
  1. stringlogfile=CachedConfigContext.Current.ConfigService.GetFilePath("log4net");
  1. varms=newMemoryStream(Encoding.Default.GetBytes(logfile));
  1. log4net.Config.XmlConfigurator.ConfigureAndWatch(newFileInfo(logfile));
  1. }
  1. }

这里我还是用了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);

  1. publicstaticclassWebApiConfig
  1. {
  1. publicstaticvoidRegister(HttpConfigurationconfig)
  1. {
  1. //WebAPI跨域访问
  1. varcors=newEnableCorsAttribute(
  1. origins:"*",
  1. headers:"*",
  1. methods:"*");
  1. config.EnableCors(cors);
  1. //WebAPI路由
  1. config.MapHttpAttributeRoutes();
  1. config.Routes.MapHttpRoute(
  1. name:"DefaultApi",
  1. routeTemplate:"api/{controller}/{id}",
  1. defaults:new{id=RouteParameter.Optional}
  1. );
  1. }
  1. }

Web api Controller

  1. [EnableCors("*","*","*")]
  1. publicclassGroupListController:ApiController
  1. {
  1. privateIGroupService_groupService;
  1. publicGroupListController(IGroupServicegroupService)
  1. {
  1. _groupService=groupService;
  1. }
  1. publicIList<GroupBaseDto>GetAll()
  1. {
  1. varlist=_groupService.GetAll();
  1. List<GroupBaseDto>groupList=AutoMapperHelper.MapToList<GroupBaseDto>(list);
  1. returngroupList;
  1. }
  1. publicGroupBaseDtoGetByID(stringid)
  1. {
  1. varitem=_groupService.GetByID(id);
  1. GroupBaseDtogroupdto=AutoMapperHelper.MapTo<GroupBaseDto>(item);
  1. returngroupdto;
  1. }
  1. publicHttpResponseMessagePostGroup(GroupBaseDtogroup)
  1. {
  1. try
  1. {
  1. group.ID=Guid.NewGuid().ToString();
  1. TGroupentity=AutoMapperHelper.MapTo<TGroup>(group);
  1. _groupService.Add(entity);
  1. returnnewHttpResponseMessage(HttpStatusCode.NoContent);
  1. }
  1. catch
  1. {
  1. thrownewHttpResponseException(HttpStatusCode.InternalServerError);
  1. }
  1. }
  1. publicHttpResponseMessagePutGroup(stringid,GroupBaseDtogroup)
  1. {
  1. try
  1. {
  1. group.ID=id;
  1. TGroupentity=AutoMapperHelper.MapTo<TGroup>(group);
  1. _groupService.Update(entity);
  1. returnnewHttpResponseMessage(HttpStatusCode.NoContent);
  1. }
  1. catch(Exceptionse)
  1. {
  1. thrownewHttpResponseException(HttpStatusCode.InternalServerError);
  1. }
  1. }
  1. publicHttpResponseMessageDeleteGroup(stringid)
  1. {
  1.  
  1. try
  1. {
  1. _groupService.Delete(id);
  1. returnnewHttpResponseMessage(HttpStatusCode.NoContent);
  1. }
  1. catch
  1. {
  1. thrownewHttpResponseException(HttpStatusCode.InternalServerError);
  1. }
  1. }
  1. }

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

  1. publicclassGroupBaseDto
  1. {
  1. publicvirtualstringID{get;set;}
  1. publicvirtualstringGROUPNAME{get;set;}
  1. publicvirtualdecimal?NORDER{get;set;}
  1. publicvirtualstringPARENTID{get;set;}
  1. publicvirtualstringGROUPTYPE{get;set;}
  1. publicvirtualstringGROUPCODE{get;set;}
  1. }

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

  1. ///<summary>
  1. ///AutoMapper扩展帮助类
  1. ///</summary>
  1. publicstaticclassAutoMapperHelper
  1. {
  1. ///<summary>
  1. ///类型映射
  1. ///</summary>
  1. publicstaticTMapTo<T>(thisobjectobj)
  1. {
  1. if(obj==null)returndefault(T);
  1.  
  1. Mapper.Initialize(cfg=>cfg.CreateMap(obj.GetType(),typeof(T)));
  1. returnMapper.Map<T>(obj);
  1. }
  1. ///<summary>
  1. ///集合列表类型映射
  1. ///</summary>
  1. publicstaticList<TDestination>MapToList<TDestination>(thisIEnumerablesource)
  1. {
  1. foreach(varfirstinsource)
  1. {
  1. vartype=first.GetType();
  1. Mapper.Initialize(cfg=>cfg.CreateMap(type,typeof(TDestination)));
  1.  
  1. break;
  1. }
  1. returnMapper.Map<List<TDestination>>(source);
  1. }
  1. ///<summary>
  1. ///集合列表类型映射
  1. ///</summary>
  1. publicstaticList<TDestination>MapToList<TSource,TDestination>(thisIEnumerable<TSource>source)
  1. {
  1. //IEnumerable<T>类型需要创建元素的映射
  1.  
  1. Mapper.Initialize(cfg=>cfg.CreateMap(typeof(TSource),typeof(TDestination)));
  1. returnMapper.Map<List<TDestination>>(source);
  1. }
  1. ///<summary>
  1. ///类型映射
  1. ///</summary>
  1. publicstaticTDestinationMapTo<TSource,TDestination>(thisTSourcesource,TDestinationdestination)
  1. whereTSource:class
  1. whereTDestination:class
  1. {
  1. if(source==null)returndestination;
  1. Mapper.Initialize(cfg=>cfg.CreateMap(typeof(TSource),typeof(TDestination)));
  1. returnMapper.Map(source,destination);
  1. }
  1.  
  1. }

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

猜你在找的Angularjs相关文章