• Asp.net MVC Api项目搭建


    整个解决方案按照分层思想来划分不同功能模块,以提供User服务的Api为需求,各个层次的具体实现如下所示:

    1、新建数据库User表

    数据库使用SQLExpress版本,表的定义如下所示:

    1. CREATE TABLE [dbo].[User] (
    2. [Id] INT IDENTITY (1, 1) NOT NULL,
    3. [Name] NVARCHAR (50) NOT NULL,
    4. [Password] NVARCHAR (50) NOT NULL,
    5. [Age] INT NOT NULL,
    6. [Birthdate] DATE NOT NULL,
    7. [CreateTime] DATETIME DEFAULT (getdate()) NOT NULL,
    8. [CreateUserId] NVARCHAR (50) NOT NULL,
    9. [CreateUserName] NVARCHAR (50) NOT NULL,
    10. [ModifiedTime] DATETIME NULL,
    11. [ModifiedUserId] NVARCHAR (50) NULL,
    12. [ModifiedUserName] NVARCHAR (50) NULL,
    13. PRIMARY KEY CLUSTERED ([Id] ASC)
    14. );

    2、实体层

    新建类库类型的项目,.net framework框架版本4.5,User实体类如下:

    1. public class User
    2. {
    3. public int Id { get; set; }
    4. public string Name { get; set; }
    5. public string Password { get; set; }
    6. public int Age { get; set; }
    7. public DateTime Birthdate { get; set; }
    8. public DateTime CreateTime { get; set; }
    9. public string CreateUserId { get; set; }
    10. public string CreateUserName { get; set; }
    11. public DateTime? ModifiedTime { get; set; }
    12. public string ModifiedUserId { get; set; }
    13. public string ModifiedUserName { get; set; }
    14. }

    3、数据库层

    该层提供数据库接口操作,采用EntitFramework4.4.0.0作为ORM实体映射框架,

    • 定义数据库操作接口IRepository
    1. public interface IRepository<TEntity> : IDisposable where TEntity : class
    2. {
    3. IEnumerable<TEntity> Get();
    4. IEnumerable<TEntity> Get(Expressionbool>> filter);
    5. IEnumerable<TEntity> Get<TOderKey>(Expressionbool>> filter, int pageIndex, int pageSize, Expression> sortKeySelector, bool isAsc = true);
    6. int Count(Expressionbool>> predicate);
    7. void Update(TEntity instance);
    8. void Add(TEntity instance);
    9. void Delete(TEntity instance);
    10. }
    • 定义数据库上下文类BceDbContext
    1. public class BceDbContext:DbContext
    2. {
    3. public BceDbContext():base("DaLeiDB")
    4. {
    5. Database.SetInitializer(null);
    6. }
    7. public DbSet<User> Users { get; set; }
    8. protected override void OnModelCreating(DbModelBuilder modelBuilder)
    9. {
    10. modelBuilder.Entity().ToTable("User");
    11. base.OnModelCreating(modelBuilder);
    12. }
    13. }
    • 定义数据库通用操作实现类BceRepository
    1. public class BceRepository<TEntity> : IRepository<TEntity> where TEntity : class
    2. {
    3. public BceDbContext DbContext { get; private set; }
    4. public DbSet DbSet { get; private set; }
    5. public BceRepository(BceDbContext context)
    6. {
    7. Guard.ArgumentNotNull(context, "context");
    8. this.DbContext = context;
    9. this.DbSet = this.DbContext.Set();
    10. }
    11. public IEnumerable<TEntity> Get()
    12. {
    13. return this.DbSet.AsQueryable();
    14. }
    15. public IEnumerable<TEntity> Get(Expressionbool>> filter)
    16. {
    17. return this.DbSet.Where(filter).AsQueryable();
    18. }
    19. public IEnumerable<TEntity> Get<TKey>(Expressionbool>> filter, int pageIndex, int pageSize, Expression> sortKeySelector, bool isAsc = true)
    20. {
    21. Guard.ArgumentNotNull(filter, "predicate");
    22. Guard.ArgumentNotNull(sortKeySelector, "sortKeySelector");
    23. if (isAsc)
    24. {
    25. return this.DbSet
    26. .Where(filter)
    27. .OrderBy(sortKeySelector)
    28. .Skip(pageSize * (pageIndex - 1))
    29. .Take(pageSize).AsQueryable();
    30. }
    31. else
    32. {
    33. return this.DbSet
    34. .Where(filter)
    35. .OrderByDescending(sortKeySelector)
    36. .Skip(pageSize * (pageIndex - 1))
    37. .Take(pageSize).AsQueryable();
    38. }
    39. }
    40. public int Count(Expressionbool>> predicate)
    41. {
    42. return this.DbSet.Where(predicate).Count();
    43. }
    44. public void Add(TEntity instance)
    45. {
    46. Guard.ArgumentNotNull(instance, "instance");
    47. this.DbSet.Attach(instance);
    48. this.DbContext.Entry(instance).State = EntityState.Added;
    49. this.DbContext.SaveChanges();
    50. }
    51. public void Update(TEntity instance)
    52. {
    53. Guard.ArgumentNotNull(instance, "instance");
    54. this.DbSet.Attach(instance);
    55. this.DbContext.Entry(instance).State = EntityState.Modified;
    56. this.DbContext.SaveChanges();
    57. }
    58. public void Delete(TEntity instance)
    59. {
    60. Guard.ArgumentNotNull(instance, "instance");
    61. this.DbSet.Attach(instance);
    62. this.DbContext.Entry(instance).State = EntityState.Deleted;
    63. this.DbContext.SaveChanges();
    64. }
    65. public void Dispose()
    66. {
    67. this.DbContext.Dispose();
    68. }
    69. }
    • 定义用户表数据库操作额外的接口IUserRepository
    1. namespace DaLei.Repository
    2. {
    3. public interface IUserRepository
    4. {
    5. User FindByName(string name);
    6. List FindByAge(int start, int end);
    7. }
    8. }
    • 定义用户表数据库操作额外的实现类UserRepository
      1. namespace DaLei.Repository
      2. {
      3. public class UserRepository : BceRepository<User>, IUserRepository
      4. {
      5. public UserRepository(BceDbContext bceDbContext):base(bceDbContext)
      6. {
      7. }
      8. public List FindByAge(int start, int end)
      9. {
      10. var rst = this.DbSet.AsQueryable().Where(u=>u.Age>=start && u.Age<=end).ToList();
      11. return rst;
      12. }
      13. public User FindByName(string name)
      14. {
      15. var rst = this.DbSet.AsQueryable().Where(u => u.Name == name).FirstOrDefault();
      16. return rst;
      17. }
      18. }
      19. }

    4、服务接口层

    定义了对外提供用户服务的接口契约,具体如下:

    1. namespace DaLei.IService
    2. {
    3. public interface IUserService
    4. {
    5. User FindByName(string name);
    6. List FindByAge(int start, int end);
    7. List GetList();
    8. }
    9. }

    5、服务具体实现层

    服务基类实现:

    1. using System;
    2. using System.Collections.Generic;
    3. namespace DaLei.Service
    4. {
    5. public abstract class ServiceBase : IDisposable
    6. {
    7. public IList DisposableObjects { get; private set; }
    8. public ServiceBase()
    9. {
    10. this.DisposableObjects = new List();
    11. }
    12. protected void AddDisposableObject(object obj)
    13. {
    14. IDisposable disposable = obj as IDisposable;
    15. if (null != disposable)
    16. {
    17. this.DisposableObjects.Add(disposable);
    18. }
    19. }
    20. public void Dispose()
    21. {
    22. foreach (IDisposable obj in this.DisposableObjects)
    23. {
    24. if (null != obj)
    25. {
    26. obj.Dispose();
    27. }
    28. }
    29. }
    30. }
    31. }

    用户服务接口具体实现:

    1. using DaLei.IService;
    2. using DaLei.Model;
    3. using DaLei.Repository;
    4. using System.Collections.Generic;
    5. namespace DaLei.Service
    6. {
    7. public class UserService : ServiceBase,IUserService
    8. {
    9. private IUserRepository userRepository;
    10. public UserService(IUserRepository userRepository)
    11. {
    12. this.userRepository = userRepository;
    13. this.AddDisposableObject(userRepository);
    14. }
    15. public List FindByAge(int start, int end)
    16. {
    17. return this.userRepository.FindByAge(start,end);
    18. }
    19. public User FindByName(string name)
    20. {
    21. return this.userRepository.FindByName(name);
    22. }
    23. public List GetList()
    24. {
    25. return this.userRepository.FindByAge(0, 100);
    26. }
    27. }
    28. }

    6、应用层

    新建Asp.net WebApi项目,引用服务接口项目、服务实现项目、实体类项目,unity相关程序集,EntityFramework程序集。

    web.config配置连接字符串和unity相关内容:

    1. "1.0" encoding="utf-8"?>
    2. <configuration>
    3. <configSections>
    4. <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
    5. configSections>
    6. <unity>
    7. <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" />
    8. <containers>
    9. <container>
    10. <extension type="Interception" />
    11. <register type="DaLei.IService.IUserService, DaLei.IService" mapTo="DaLei.Service.UserService, DaLei.Service" />
    12. <register type="DaLei.Repository.IUserRepository, DaLei.Repository" mapTo="DaLei.Repository.UserRepository, DaLei.Repository">
    13. <interceptor type="InterfaceInterceptor" />
    14. <policyInjection />
    15. register>
    16. container>
    17. containers>
    18. unity>
    19. <connectionStrings>
    20. <add name="DaLeiDB" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=DaleiDB;User ID=sa;Password=anpiel0991;" providerName="System.Data.SqlClient" />
    21. connectionStrings>
    22. <appSettings>
    23. <add key="webpages:Version" value="3.0.0.0"/>
    24. <add key="webpages:Enabled" value="false"/>
    25. <add key="PreserveLoginUrl" value="true"/>
    26. <add key="ClientValidationEnabled" value="true"/>
    27. <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    28. appSettings>
    29. <system.web>
    30. <compilation debug="true" targetFramework="4.5"/>
    31. <httpRuntime targetFramework="4.5"/>
    32. <pages>
    33. <namespaces>
    34. <add namespace="System.Web.Helpers"/>
    35. <add namespace="System.Web.Mvc"/>
    36. <add namespace="System.Web.Mvc.Ajax"/>
    37. <add namespace="System.Web.Mvc.Html"/>
    38. <add namespace="System.Web.Routing"/>
    39. <add namespace="System.Web.WebPages"/>
    40. namespaces>
    41. pages>
    42. system.web>
    43. <system.webServer>
    44. <validation validateIntegratedModeConfiguration="false"/>
    45. <handlers>
    46. <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
    47. <remove name="OPTIONSVerbHandler"/>
    48. <remove name="TRACEVerbHandler"/>
    49. <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler"
    50. preCondition="integratedMode,runtimeVersionv4.0"/>
    51. handlers>
    52. system.webServer>
    53. <runtime>
    54. <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    55. <dependentAssembly>
    56. <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
    57. <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
    58. dependentAssembly>
    59. <dependentAssembly>
    60. <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
    61. <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
    62. dependentAssembly>
    63. <dependentAssembly>
    64. <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
    65. <bindingRedirect oldVersion="1.0.0.0-5.2.7.0" newVersion="5.2.7.0"/>
    66. dependentAssembly>
    67. <dependentAssembly>
    68. <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35"/>
    69. <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0"/>
    70. dependentAssembly>
    71. <dependentAssembly>
    72. <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
    73. <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
    74. dependentAssembly>
    75. <dependentAssembly>
    76. <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35"/>
    77. <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930"/>
    78. dependentAssembly>
    79. assemblyBinding>
    80. runtime>
    81. <system.codedom>
    82. <compilers>
    83. <compiler language="c#;cs;csharp" extension=".cs"
    84. type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    85. warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
    86. <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
    87. type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    88. warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>
    89. compilers>
    90. system.codedom>
    91. configuration>
    • Controller实例化由Unity负责处理,需要实现控制器工厂类
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.Mvc;
    6. using System.Web.Routing;
    7. using Microsoft.Practices.Unity;
    8. using Microsoft.Practices.Unity.Configuration;
    9. using System.Configuration;
    10. namespace WebApi.Extensions
    11. {
    12. public class UnityControllerFactory : DefaultControllerFactory
    13. {
    14. static object syncHelper = new object();
    15. static Dictionary<string, IUnityContainer> containers = new Dictionary<string, IUnityContainer>();
    16. public IUnityContainer UnityContainer { get; private set; }
    17. public UnityControllerFactory(string containerName = "")
    18. {
    19. if (containers.ContainsKey(containerName))
    20. {
    21. this.UnityContainer = containers[containerName];
    22. return;
    23. }
    24. lock (syncHelper)
    25. {
    26. if (containers.ContainsKey(containerName))
    27. {
    28. this.UnityContainer = containers[containerName];
    29. return;
    30. }
    31. IUnityContainer container = new UnityContainer();
    32. //配置UnityContainer
    33. UnityConfigurationSection configSection = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;
    34. if (null == configSection && !string.IsNullOrEmpty(containerName))
    35. {
    36. throw new ConfigurationErrorsException("The configuration section does not exist.");
    37. }
    38. if (null != configSection)
    39. {
    40. if (string.IsNullOrEmpty(containerName))
    41. {
    42. configSection.Configure(container);
    43. }
    44. else
    45. {
    46. configSection.Configure(container, containerName);
    47. }
    48. }
    49. containers.Add(containerName, container);
    50. this.UnityContainer = containers[containerName];
    51. }
    52. }
    53. protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    54. {
    55. if (null == controllerType)
    56. {
    57. return null;
    58. }
    59. return (IController)this.UnityContainer.Resolve(controllerType);
    60. }
    61. //public override void ReleaseController(IController controller)
    62. //{
    63. // this.UnityContainer.Teardown(controller);
    64. //}
    65. }
    66. }
    • 设置MVC框架的控制器工厂为自定义类型
    1. using webApi.Extensions;
    2. using System;
    3. using System.Web;
    4. using System.Web.Http;
    5. using System.Web.Mvc;
    6. using System.Web.Routing;
    7. namespace WebApp
    8. {
    9. public class Global : HttpApplication
    10. {
    11. void Application_Start(object sender, EventArgs e)
    12. {
    13. // 在应用程序启动时运行的代码
    14. AreaRegistration.RegisterAllAreas();
    15. GlobalConfiguration.Configure(WebApiConfig.Register);
    16. RouteConfig.RegisterRoutes(RouteTable.Routes);
    17. ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());
    18. }
    19. }
    20. }
    • 新建Controller基类,所有的自定义Controller均继承此类
    1. using WebApi.Extensions;
    2. using System.Web.Mvc;
    3. using System;
    4. using System.Collections.Generic;
    5. namespace WebApp.Controllers
    6. {
    7. public class BaseController:Controller
    8. {
    9. public IList DisposableObjects { get; private set; }
    10. public BaseController()
    11. {
    12. this.DisposableObjects = new List();
    13. }
    14. protected void AddDisposableObject(object obj)
    15. {
    16. IDisposable disposable = obj as IDisposable;
    17. if (null != disposable)
    18. {
    19. this.DisposableObjects.Add(disposable);
    20. }
    21. }
    22. protected override void Dispose(bool disposing)
    23. {
    24. if (disposing)
    25. {
    26. foreach (IDisposable obj in this.DisposableObjects)
    27. {
    28. if (null != obj)
    29. {
    30. obj.Dispose();
    31. }
    32. }
    33. }
    34. base.Dispose(disposing);
    35. }
    36. }
    37. }
    • 新建测试Controller
    1. using DaLei.IService;
    2. using System.Web.Mvc;
    3. namespace WebApp.Controllers
    4. {
    5. public class TestController : BaseController
    6. {
    7. private IUserService userService;
    8. public TestController(IUserService userService)
    9. {
    10. this.userService = userService;
    11. this.AddDisposableObject(userService);
    12. }
    13. // GET: Test
    14. public ActionResult Index()
    15. {
    16. var users = this.userService.GetList();
    17. return View();
    18. }
    19. }
    20. }

    浏览器输入地址测试TestController!

  • 相关阅读:
    ubuntu循环登录,无法进入桌面
    关系运算的元方法(Metamethods)
    随机梯度下降法、牛顿法、冲量法、AdaGrad、RMSprop以及Adam优化过程和理解
    代理服务器拒绝连接
    2024年AI助力研发:内容驱动下的全新变革与展望
    运行维护-Linux操作系统
    基于eNSP的校园网设计的仿真模拟
    k8s master节点更换ip 重签证书
    CE修改器入门:运用代码注入
    八大时态-英语中的八个基本时态
  • 原文地址:https://blog.csdn.net/dandingwangzi/article/details/134495460