Asp.Net WebApi2+Unity+EF6.0整合

本文详细介绍了如何在ASP.NET WebAPI项目中通过Unity进行依赖注入,并结合EF进行数据库操作的具体步骤,包括创建数据库、实体模型、DAO层和服务层等。

阅读此文前请先掌握小白快速入手Asp.Net WebApi2Asp.Net WebApi2中实现Unity的注入

1、创建数据库和表

CREATE DATABASE IocProjectDB
USE [IocProjectDB]
GO
/****** Object:  Table [dbo].[T_User]    Script Date: 12/29/2017 15:49:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_User](
	[UserID] [int] IDENTITY(1,1) NOT NULL,
	[UserCode] [nvarchar](50) NOT NULL,
	[UserName] [nvarchar](50) NULL,
	[UserPwd] [nvarchar](50) NOT NULL,
	[Gender] [nchar](10) NULL,
	[Birthday] [datetime] NULL,
	[MobileNo] [nvarchar](50) NULL,
	[Address] [nvarchar](50) NULL,
	[Remarks] [nvarchar](200) NULL,
	[CreateUserID] [int] NULL,
	[CreateTime] [datetime] NULL,
 CONSTRAINT [PK_T_User] PRIMARY KEY CLUSTERED 
(
	[UserID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[T_User] ON
INSERT [dbo].[T_User] ([UserID], [UserCode], [UserName], [UserPwd], [Gender], [Birthday], [MobileNo], [Address], [Remarks], [CreateUserID], [CreateTime]) VALUES (1, N'zhangsan', N'张三', N'123', N'F         ', CAST(0x000088B100000000 AS DateTime), N'15365428564', N'广东深圳福田', N'测试用户', 7, CAST(0x0000A85800000000 AS DateTime))
INSERT [dbo].[T_User] ([UserID], [UserCode], [UserName], [UserPwd], [Gender], [Birthday], [MobileNo], [Address], [Remarks], [CreateUserID], [CreateTime]) VALUES (2, N'lisi', N'李四', N'456', N'M         ', CAST(0x0000863100000000 AS DateTime), N'13526548954', N'湖北武汉光谷', N'测试用户', 7, CAST(0x0000A85800000000 AS DateTime))
SET IDENTITY_INSERT [dbo].[T_User] OFF

2、使用EF连接数据库

  1)在IocProject.Model层创建Models文件夹,然后文件夹下创建实体数据模型DbModels.edmx,具体步骤截图如下:

160551_PY3z_1995422.png

选择从数据库生成

160703_C2rd_1995422.png

创建数据库连接

160737_fVlc_1995422.png

160902_PJux_1995422.png

选是,点击下一步,选择实体框架6.0,下一步选择要创建的表

161201_Av7M_1995422.png

161220_rw0e_1995422.png

161448_c85p_1995422.png

161536_YtuL_1995422.png

最终效果如下图:

161750_o4LW_1995422.png

3、在IocProject.Dao层中连接数据库操作并实现查询父类与子类

  1)在IocProject.Dao层创建一个BaseDBContext类,用来自定义EF上下文,首先引用EF框架。备注:IocProject.Dao层需要引用IocProject.Model层。

163800_Qwjp_1995422.png

163851_cHSI_1995422.png

创建BaseDbContext类:

namespace IocProject.Dao
{
    /// <summary>
    /// 自定义的EF上下文容器类
    /// </summary>
    public class BaseDbContext : DbContext
    {
        /// <summary>
        /// 负责根据指定的数据库链接字符串,初始化EF
        /// </summary>
        public BaseDbContext() : base("name=IocProjectDBEntities") { }
    }
}

  2)创建BaseDao类来存放每个类中共有的方法:查询、新增、编辑、删除、执行Sql语句。
这里先实现一个查询的方法,然后接下来在扩充,创建BaseDao类和IBaseDao接口:

namespace IocProject.Dao
{
    /// <summary>
    /// 负责操作数据库中的所有表的普通增,删,查,改操作的
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public class BaseDao<TEntity> : IBaseDao<TEntity> where TEntity : class
    {
        //实例化EF上下文容器对象
        BaseDbContext db = new BaseDbContext();

        DbSet<TEntity> _dbset;

        public BaseDao()
        {
            //初始化
            _dbset = db.Set<TEntity>();
        }

        #region 查询
        /// <summary>
        /// 查询所有数据
        /// </summary>
        /// <returns></returns>
        public List<TEntity> QueryList()
        {
            return _dbset.ToList();
        }

        /// <summary>
        /// 根据条件查询单个实体数据
        /// </summary>
        /// <param name="where"></param>
        /// <returns></returns>
        public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
        {
            return _dbset.Where(where).ToList();
        }
        #endregion
    }
}
namespace IocProject.Dao
{
    public interface IBaseDao<TEntity> where TEntity : class
    {
        /// <summary>
        /// 查询所有数据
        /// </summary>
        /// <returns></returns>
        List<TEntity> QueryList();

        /// <summary>
        /// 根据条件查询单个实体数据
        /// </summary>
        /// <param name="where"></param>
        /// <returns></returns>
        List<TEntity> Query(Expression<Func<TEntity, bool>> where);
    }
}

  3)创建UserDao类和IUserDao接口来继承BaseDao和IBaseDao:

namespace IocProject.Dao.User
{
    public class UserDao : BaseDao<T_User>, IUserDao
    {

    }
}
namespace IocProject.Dao.User
{
    public interface IUserDao : IBaseDao<T_User>
    {

    }
}

4、在IocProject.Service层调用IocProject.Dao层

  1)创建BaseService基类和IBaseService接口,并且调用BaseDao中查询的方法

namespace IocProject.Service
{
    public class BaseService<TEntity> :IBaseService<TEntity> where TEntity : class
    {
        public IBaseDao<TEntity> _baseDao; 

        /// <summary>
        /// 构造器注入
        /// </summary>
        /// <param name="baseDao"></param>
        public BaseService(IBaseDao<TEntity> baseDao)
        {
            _baseDao = baseDao;
        }

        #region 查询
        /// <summary>
        /// 查询所有数据
        /// </summary>
        /// <returns></returns>
        public List<TEntity> QueryList()
        {
            return _baseDao.QueryList();
        }

        /// <summary>
        /// 根据条件查询单个实体数据
        /// </summary>
        /// <param name="where"></param>
        /// <returns></returns>
        public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
        {
            return _baseDao.Query(where);
        }
        #endregion
    }
}
namespace IocProject.Service
{
    public interface IBaseService<TEntity> where TEntity : class
    {
        /// <summary>
        /// 查询所有数据
        /// </summary>
        /// <returns></returns>
        List<TEntity> QueryList();

        /// <summary>
        /// 根据条件查询单个实体数据
        /// </summary>
        /// <param name="where"></param>
        /// <returns></returns>
        List<TEntity> Query(Expression<Func<TEntity, bool>> where);
    }
}

  2) 创建UserService类和IUserService接口来继承BaseService和IBaseService:

namespace IocProject.Service.User
{
    public class UserService : BaseService<T_User>, IUserService
    {
        public IUserDao _userDao;

        /// <summary>
        /// 构造器注入
        /// </summary>
        /// <param name="userDao"></param>
        public UserService(IUserDao userDao)
            : base(userDao)
        {
            _userDao = userDao;
        }
    }
}
namespace IocProject.Service.User
{
    public interface IUserService:IBaseService<T_User>
    {

    }
}

5、在IocProject.WebApi层添加控制器UserController.cs

namespace IocProject.WebApi.Controllers
{
    public class UserController : ApiController
    {
        public IUserService _userService;

        /// <summary>
        /// 构造器注入
        /// </summary>
        /// <param name="userService"></param>
        public UserController(IUserService userService)
        {
            _userService = userService;
        }

        /// <summary>
        /// 查询所有数据
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IEnumerable<T_User> QueryList()
        {
            return _userService.QueryList();
        }

        /// <summary>
        /// 根据id查询单个实体数据
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet]
        public IEnumerable<T_User> Query(int id)
        {
            return _userService.Query(c => c.UserID == id);
        }
    }
}

修改App_Start文件夹下UnityConfig类下的Initialise方法,如下图:

namespace IocProject.WebApi
{
    public static class UnityConfig
    {
        /// <summary>
        /// 注册接口和实现  
        /// </summary>
        /// <param name="config"></param>
        public static void Initialise(HttpConfiguration config)
        {
            var container = new UnityContainer();
            container.RegisterType<IBaseDao<TEntity>, BaseDao<TEntity>>();
            container.RegisterType<IBaseService<TEntity>, BaseService<TEntity>>();

            container.RegisterType<IUserDao, UserDao>();
            container.RegisterType<IUserService, UserService>();
            config.DependencyResolver = new UnityResolver(container);
        }
    }

    class TEntity
    {
    }
}

然后在IocProject.Model层中的App.Config文件中把数据库链接拷贝到IocProject.WebApi层Web.config中,如下图:

203911_Xcnl_1995422.png

204451_DNay_1995422.png

6、运行项目

在浏览器Url后面加上“/api/user”查询所有的用户,加上“/api/user/2”查询单个用户,如下图:

204810_RwLG_1995422.png

210208_8KTR_1995422.png

 

转载于:https://my.oschina.net/jokeny/blog/1596753

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值