32450新蒲京网站不应用DalFactory和IDAL,援助各个数

2019-11-26 15:01 来源:未知

MS的PetShop示例应用程序的“多层架构”被比比较多.NET开垦人士奉为杰出的架构,笔者原先做的花色共青团和少先队的Leader也是照搬它的,以至过来现在以此公司后,许多少个新来的同事建应用方案也是照搬PetShop的架构,可以预知PetShop对大家影响之深。

1.增加并加入

上面是PetShop 3.0的架构图:

在project.json中添加

32450新蒲京网站 1

"tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.0"
    },
    "Pomelo.EntityFrameworkCore.MySql": "1.0.1",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
  },

为了帮衬多数据库应用,在DAL中,定义了DAL Interface和DAL Factory,上面这些图恐怕跟轻便直观一些(援用Do you know, jack? 园友 中的图片,请见谅:))

  在 tools中加入

32450新蒲京网站 2

 "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"

在dependencies中加入

  "Pomelo.EntityFrameworkCore.MySql": "1.0.1",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
在Startup.cs中加入

  public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddApplicationInsightsTelemetry(Configuration);

            services.AddDbContext<这里填写你的DbContext>(options => options.UseMySql(Configuration.GetConnectionString("DefaultConnectionString")));

            services.AddMvc();
        }

 

                                                                                                   上边这么些地点能够一向填写您的数据库连接字符串。//举例 "Server=localhost;database=MySql德姆o;uid=root;pwd=123456;"

因此那个图大家都能够清楚,引进DalFactory和IDAL正是为了系统辅助差异的数据库。

services.AddDbContext<这里填写你的DbContext>(options => options.UseMySql(Configuration.GetConnectionString("DefaultConnectionString")));

这里的Configuration读取的是appsettings.json 。
所以你要在appsetting.json 添加一个

"ConnectionStrings": {
    "DefaultConnectionString": "Server=localhost;database=MySqlDemo;uid=Quan;pwd=123456;"
  },

PDF.NET数据开拓框架选用了完全两样的点子,先看看它的支行架构图:

下一场她就能够读到那几个字符串了。

32450新蒲京网站 3

本来你的DbContext一定要有构造方法。

只要在DAL中尚无某种数据库特有的SQL语句,DalFactory是无需的,当然IDAL也无需了。比方ORM操作,日常不会用到数据库的特点,发出的都以正式的SQL语句。PDF.NET数据开垦框架的ORM操作是因而EntityQuery和OQL表明式来落实,在切切实实支持分歧数据库的时候,底层选用的是反光工厂情势:

 public class MySqlDemoContext : DbContext
    {
        public MySqlDemoContext(DbContextOptions<MySqlDemoContext> options): base(options)
        {
        }
}

这样你的mysql数据库就能练得上了,可以当然但是这样连接上去并存入数据有可能会报错,因为efcore,并不会主动地创建数据库

 public class MySqlDemoInitializer
    {
        public static void Seed(IApplicationBuilder app)
        {
            // Get an instance of the DbContext from the DI container
            using (var context = app.ApplicationServices.GetRequiredService<MySqlDemoContext>())
            {
                //如果数据库不存在就会去创建
                context.Database.EnsureCreated();
                //这里半段有无数据在在表里,如果有不初始化数据,如果没有就初始化
                if (context.Set<Account>().Any() == false)
                {
                    SetBasicData(context);
                    SetTestAdmin(context);
#if DEBUG
                    SetTestNews(context);
                    SetTestCase(context);
                    SetTestPartner(context);
                    SetTestCompany(context);
                    SetTestPosition(context);
                    SetTestProblem(context);
                    SetTestRefund(context);
#endif
                }
            }
        }

 

 

 /// <summary>
        /// 制造公共数据访谈类的实例
        /// </summary>
        /// <param name="providerAssembly">提供那程序集名称</param>
        /// <param name="providerType">提供者类型</param>
        /// <returns></returns>
        public static AdoHelper CreateInstance( string providerAssembly, string providerType )
        {
            Assembly assembly = Assembly.Load( providerAssembly );
            object provider = assembly.CreateInstance( providerType );

这里就是一个初始化的方法,在startup.cs中运行该方法  这个方式初始化有一个不灵活的地方,当程序运行之后只会执行一次。并不会像ef6那样,运行之后也会判断数据库,不存在也会去创建。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {

//将该方法放于最后执行
 MySqlDemoInitializer.Seed(app);
}

还有一点,取数据的时候,取出来的Model是不会带有外键
这里就要用贪心加载 这样他就能取出Model所关联的外键

db.Set<Account>()
                .Include(m => m.Role)
                .Include(m => m.AccountInfo)
                .Include(m => m.AccountModules);

            if( provider is AdoHelper )
            {
                return provider as AdoHelper;
            }
            else
            {
                throw new InvalidOperationException("当前点名的的提供程序不是 AdoHelper 抽象类的现实性实现类,请保管应用程序进行了不错的安插(如connectionStrings 配置节的 providerName 属性卡塔尔国。");
            }
        }

 还犹怎样在Controller中动用

 

public class AccountController : Controller
{
        private AccountService _accountServ;
        public AccountController(MySqlDemoContext _db)
        {
            _accountServ = new AccountService(_db);
        }
}

那般只需求在安顿文件中实行铺排,指明选拔何种数据库就能够,那是框架脱离DalFactory+IDAL的第黄金时代种艺术。

由此信任注入,程序会自行将MySql德姆oContext new出来,并流入进来

当然,为了急速的运用某种数据库的特色,有超级大希望会写一些数据库天性的SQL,要使得系统援救分歧的数据库,还得利用DalFactory,由此得定义IDAL。

 

 

PDF.NET数据开拓框架为领会决那几个难点,将有所的SQL语句写在一个配置文件SqlMap.config中,使用工具自动生成框架的DAL代码,即SqlMapDAL,不一致的数据库系统使用分裂的SqlMap.config文件就可以,无需替换SqlMapDAL,因而,框架再也不要求定义DalFactory和IDAL了,那应该算是第三种办法。
下图是依赖SqlMap自动生成代码并运转的流水线:

32450新蒲京网站 4

 

在SqlMap中,能够将结果映射成DataSet,实体类和实体类会集,也能够是单值类型,能够成功各样繁复的SQL操作,能够拍卖存款和储蓄进程。系统将SQL语句中的参数映射成DAL代码中方法的参数,使得操作拾贰分直观高效,並且未有SQL注入的主题素材。

 

PDF.NET数据开拓框架通过自身的ORM(EntityQuery+OQL卡塔 尔(英语:State of Qatar)结合SQL-MAP的艺术,使得喜欢OO的人和喜欢SQL的人都能找到自个儿索要的,便利性和灵活性都能够兼得。

详尽请看官方网站介绍: 

抑或看笔者博客中的相关小说介绍。

 

 

TAG标签:
版权声明:本文由32450新蒲京网站发布于葡萄游戏厅_体育游戏,转载请注明出处:32450新蒲京网站不应用DalFactory和IDAL,援助各个数