这是<如何用ABP框架快速完成项目 >系列中和DevOps系列文章其中一篇文章。
 
 
上一篇文章说了如何在.NET Core里安装Specflow. 然而文章成果只到了hello world级别。
要想真的和实际业务结合,比如要能够IOC new class实例和能够调用数据库和第三方服务。用专业术语来说,就是能跑集成测试和单元测试。这就是这篇文章的目的了。
 
和.NET不一样的是,.NET Core取消了App.config,并且整个机制都改变了。导致很多.NETer转.NET Core的时候一脸懵逼
 
所以在.NET Core下运用BDD/TDD也不一样了。这篇文章就讲讲如何配置。
 
  1. 原来app.config一分为二,specflow部分划为specflow.json,在这篇文章里有提到。其他划为appsetting.json
  2. 文件格式也从原来的xml文档变为json文档。
  3. 同时还需要把appsetting.json文件属性设置为如下
    aaarticlea/png;base64,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" alt="" />
  4. 读取配置的方式也从原来的system.configmanager.appsetting变为 IConfigurationRoot[key]方式。示例代码如下:

        public class AppEnvConfiguration : ITransientDependency
    {
    private readonly IConfigurationRoot _appConfiguration; public bool IsEnableADFS => bool.Parse(_appConfiguration["ExternalAuth:WsFederation:IsEnabled"]); public AppEnvConfiguration(IAppConfigurationAccessor configurationAccessor)
    {
    _appConfiguration = configurationAccessor.Configuration;
    }
    }

      

 
Q&A:
  1. 为啥集成测试里面数据库返回结果数目总是0?
    答:检查一下测试项目目录\bin\Debug\netcoreapp2.1目录下有没有appsetting.json这个文件,没有则看看有没有做上面的第3步. 或者用如下代码去检查能否正常读取到数据库ConnectionString

    string conString = Microsoft
    .Extensions
    .Configuration
    .ConfigurationExtensions
    .GetConnectionString(this.Configuration, GHITAssetNgConsts.ConnectionStringName);

      如果还是解决不了,则先阅读这篇文章这篇文章
    PS:有人反映上面两篇文章全英文,看不懂!好吧,我就讲重点吧。

    ABP的Test项目默认是只支持mock和EFInMemoery的,不支持集成测试所需要的真实数据库连接,所以我们要么就搞双兼容,要么就另开一个测试project单独去做集成测试。双兼容关键代码如下:

    public class XXXTestModule : AbpModule
    {
    private readonly IConfigurationRoot _appConfiguration; bool 使用UAT真实数据库而不是Mock或者EFInMemory = true;
    public XXXTestModule(XXXEntityFrameworkModule abpProjectNameEntityFrameworkModule)
    {
    if (使用UAT真实数据库而不是Mock或者EFInMemory)
    {
    abpProjectNameEntityFrameworkModule.SkipDbSeed = true; _appConfiguration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .AddEnvironmentVariables()
    .Build();
    }
    else
    {
    abpProjectNameEntityFrameworkModule.SkipDbContextRegistration = true;
    abpProjectNameEntityFrameworkModule.SkipDbSeed = true;
    }
    } public override void PreInitialize()
    {
    Configuration.UnitOfWork.Timeout = TimeSpan.FromMinutes(30);
    Configuration.UnitOfWork.IsTransactional = false; // Disable static mapper usage since it breaks unit tests (see https://github.com/aspnetboilerplate/aspnetboilerplate/issues/2052)
    Configuration.Modules.AbpAutoMapper().UseStaticMapper = false; Configuration.BackgroundJobs.IsJobExecutionEnabled = false; // Use database for language management
    Configuration.Modules.Zero().LanguageManagement.EnableDbLocalization(); if (使用UAT真实数据库而不是Mock或者EFInMemory)
    {
    if (Configuration == null) throw new NullReferenceException($"{nameof(Configuration)} is null");
    Configuration.DefaultNameOrConnectionString = _appConfiguration.GetConnectionString(
    GHITAssetNgConsts.ConnectionStringName
    );
    }
    else
    {
    RegisterFakeService<AbpZeroDbMigrator<XXXDbContext>>();
    } Configuration.ReplaceService<IEmailSender, NullEmailSender>(DependencyLifeStyle.Transient);
    }

      

    public abstract class XXXNgTestBase : AbpIntegratedTestBase<XXXTestModule>
    {
    void NormalizeDbContext(XXXDbContext context)
    {
    context.EntityChangeEventHelper = NullEntityChangeEventHelper.Instance;
    context.EventBus = NullEventBus.Instance;
    context.SuppressAutoSetTenantId = true;
    } protected XXXNgTestBase()
    {
    var 使用UAT真实数据库而不是Mock或者EFInMemory = true; if (使用UAT真实数据库而不是Mock或者EFInMemory)
    { }
    else
    {
    // Seed initial data for host
    AbpSession.TenantId = null;
    UsingDbContext(context =>
    {
    NormalizeDbContext(context);
    new InitialHostDbBuilder(context).Create();
    new DefaultTenantBuilder(context).Create();
    }); // Seed initial data for default tenant
    AbpSession.TenantId = 1;
    UsingDbContext(context =>
    {
    NormalizeDbContext(context);
    new TenantRoleAndUserBuilder(context, 1).Create();
    }); LoginAsDefaultTenantAdmin();
    }
    }

      

    至于为啥不是像ABP官网所说的去配置呢?因为ABP官网说的这种配置方法不是用于集成测试的,而是用于单元测试的。

 
通过以上步骤,终于可以调用数据库和第三方服务来跑集成测试了。然而还有一个很大问题,单元测试跑不过啊!!!
 
为什么会跑不过呢?
因为BDD和TDD不一样。
TDD的Test case是可以直接继承ABP里面的XXXTestBase基类的,这个基类里面提供了IOC new class实例等一系列很有用的方法。
但是BDD的Specflow却是Test Case和Step Definition分离的。在Step Definition里面是无法调用XXXTestBase基类里的这些方法的。
 
那怎么办呢?
照如下步骤办即可:
  1. 新增一个TestBaseWrappers文件夹
  2. 然后根据实际业务从最小化角度来建立TestBaseWrapper类
  3. 在这个类里面写IOC代码
  4. 然后再Step Definition类里调用这些TestBaseWrapper类。
 
Q&A:
  1. 为什么不用Step Definition类直接继承ABP里面的XXXTestBase基类呢?
    答:首先会报错。然后我在这篇文章里面说到,我们只有一个Step Definition类,然后分布在多个文件,通过Partial关键字来组合。所以如果Step Definition这么大的一个类来直接继承TestBase基类,然后在TestBase基类里构造函数来IOC初始化所有要调用Service类实例,第一会遇到性能问题,第二会遇到循环调用问题,这画面太美不敢看啊。
  2. 报错:Message: System.InvalidOperationException : Mapper not initialized. Call Initialize with appropriate configuration. If you are trying to use mapper instances through a container or otherwise, make sure you do not have any calls to the static Mapper.Map methods, and if you're using ProjectTo or UseAsDataSource extension methods, make sure you pass in the appropriate IConfigurationProvider instance.如何解决?
    aaarticlea/png;base64,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u4ybZMy0l+W8Zv/qUpNMRXPZmWpOPOcr0l7s+z7WXdW3vS7l+0czrsr4dayrad1n+FJXey7r+7X2tK8mGZdl495pveu5mDGay/rG67t92+tSvn8046qMX8e6qfae9RVl/bh3Ws96/m+VcV2m6ynvVXm9VlV96mseyuMHET9A02WyvMnOKD2n166qqd1Mlc9qUVYzk7pdx1ysZX21yqvJrCjOzs6szkXVmShmsv20pjST5TPdDDeZpf07ZpjpnEnGVXXT9Vx2L7Xad7Ks1uw6m5/VVJZxVd1oL8tVc+O5VaYS50TVjFifntWaX2c5s+q7ODPL72ZMtveaXleqvta7GbFne69156JujqtqKsu4qm66nsvupVb7iueq/KrvtG/XWX43Y7K91/Q66s65WIt91fVcnBXPVLXK5Lyrel7rzj3iKx7KJx/OKtN9kKvMtG/uyDwyw8TeNFvlqswqX/Vd7E9mm9X8rD6ZtxJzq73T+ipT9aOYW82taP+OGWYyZ/deVd10PRcz3X4yz3VZ71WZyT3vqMdaddZ4b5LJZL1Yq86vctU54z3NdOe7WWaa9d4jmckMt5phJhnl9aqfidnJPScZVdVN13Mx0+0n81x3bmfmNOu9RzI7M9xqltmZl5nMevR+u3XjvZjpzkz91EN5tbxf0Uy1vJ/R+jRTLe9ntF5lTOxNs1Wuyth1tbzfiX3dd2dX87P6ZF7GerrUau+07nOy5f2JmKvOZXWr6XJZ1lR1F/uTOXZdrUrV6+q6VLePvU6X9V6VifesVmanHmvVWeO9SSaT9WKtOr/KVeeM9zTTnc9mWU2Xy7LOe9NMtby/UmViPctZrVpOrzsxV52Ls6tVqXpdXZfq9rHX6c6tZlpNl8uyznvTTLW8X4m9Kns156yuy3V5V2WMz8tWpqob78VMd2bq5/+bctf1vXd1htYfybg7Z+zcq8pWmZ3ZmdifzvZelcnqk3nKarG+u3darzJu1XdX792dm8zIdDPV5F4rdm51v2lG6T72Ol3We1Xm6j1Nlrdat5xeR96bZCKrd8vptYr11V55rzrTzbLrVb/ivUczZtU3VSarW03rk/kmnsvEfpXX+mpmxc6t7jfNKN3HXqeas5q/6le892jGTGa4KpvVrbY6v8rEnptkTNfLTGf59e78Cg/l/+r63rs6Q+uPZNydM3buVWWrzM7sTOxPZ3uvymT1yTw1qa32TutVxq367q57r/qmqrvYn8xZzVzpZmWzV5luXqfLeq/KXL2nyfLdjOm9vDedpaZnpudXe+W96kw3K/bMqu+892jGrPqmytxx/2gy01VZre/eP+pmZbNXmW5ep5qzO3/Vd957NGMmM1yVnc6YzOvybpIxXS8zneXXu/MrP/1/9FRZ3uzOyKxm2H6VUVXvyowuY7RfZbvMzvxoNSs7q7Vq9upcNMnbPqupbI6Z5kzXU1funZ3p+q6qu2xuZpqb0LOrubafZFTcd7Ks1qpZz7xnpD27Xp2fZKJpL5td1aJV7Y4zto/9mDG7GZNlXNdz2X2ymtJel4umM02VneYm9Oxqru0nGRX3lSy3qmX3iv2YMbsZk2XcTq/KTmes5tm+y7vVHNX1Istm+ep+O7M7X/VQrstrUcx5Rv+NvShmPOf/RrGu57wXMybmPOP/Rlldz8Z+lo80U+VXGavFpapeto88E7Mmy5usXmVNN8eX75X2TOy7rO5ndXl9Qs+Y6lys+zmvaz9mXVV3Os/szPGzujJdpqt5veq72DeeidlMl63OZnWd4SsT61VOeUb/1aV2Mib2MjGvy2tKe8rrWb/KR9k5X753WtOlJhkXM57zf1dWZ7O+in3PZLVKzFT5rO5ndWW6TFfzetV3sW88E7OqOhfFms/0uva1pktNMi5mPOf/Gr02q72LM3SpruZ17cesy+o+w5eKvdh3Xt/J3uFrHsofdeeH+ime8Z4/8XP8xZ89vt8zf6/5m/lj8lnweeER/I69tzs/ex7K//Vrv9DPer+f+DnyZYZv9Mzfa/5m/ph8FnxeeAS/Y+/r7s+dh/J//dov9DPer838tM/x137u+C3P+v3m7+aPyWfB54VH8Dv2vu7+3Hko/9ev/ELb+7z7vfrMX/kMgV/H3/ofk8+CzwuP4Hfs/djn/YzPnIdyAAAA4DAeygEAAIDDeCgHAAAADuOhHAAAADiMh3IAAADgMB7KAQAAgMN4KAcAAAAO46EcAAAAOIyHcgAAAOAwHsoBAACAw3goBwAAAA7joRwAAAA47Ksfyv/6+59/r+bszJVzmbvm3E1f17u+Rvwnfk54F8/+XXzH3/Urr8nOvPK9PHKvd/zMgV/EQ7m4+4vpXb/o9HXxZfwZnvFzms68+942r1rf6pve27Pfyzt+VruvSfOvej+P3OcdPvN3eA3AaTyUi7u/FOK8yfxXfDHpPV5xv9M+8T3G1/yM92AzV3MnmUc8c/bKyXt/kvg5Pftze8efy+5rOvEeHrnnu3zm7/izB16Jh3Jx9xdCnDeZ/4ovJb3HK+532ie+x/ian/EebOZq7iTziGfOXjl5708SP6dnf27v+HPZfU0n3sMj93yXz/wdf/bAK33VQ7n9QfvyfaQZ7Wf1rObi3mk9XvuqdBntZf2oy+s+9oyem2Sjac3Euu11qbh3Vd1Us4z2sr6q+rGu83Z6Ksv4tfa0ryYZ470qU/Vtr0v5vsuo2JueU9mZ7KzWYl5pT/t+XfVd1p/mnO+7TJSdcVlNaV8zVc3/zfpqN+N7pf3YU6vcqq9iLstrRvuxHnv+b9ZXq0zsZRml+Zj1fZdxVabLKz2bndFa1ge+2dc8lMc/3uwPfpWJ/WiS7TKr+SbLTGsdzVfXprtX11PTmtH66txkRmY113VzJvfeOW/7R/NVTWUZ5/Wrfad9u87y1Yx4NqrOudi3vde0l82Z1GzvNb12sRb7LjsXxTnZmeyci33fxzOTvdZWfVPVolUmzslmTF2dE7O2z2oqZrpr3ZuqpmJm1Z+I87LzsdZlsp7RejYvqwG/6iseyqs/Yq0/knGPzlvNNztnJvOcZifXkfey/O4Mt3uuynRnTexP7hVN6o+cjWJvMmP3Pt3ZyVw3zWY9r+2eM6v6anasT+dFWn8kY7w3mRNlvVVtcp+YuXJGee/ROStX5jzymqrMI2eV1yczJib3NKv7miqj++p8dwb4NT/1UF4tp9duJ2u6THVG7ZxZzbO+Lje5jryX5XdnuN1zVaY7a2J/cq9oWs9yVqtWJfaqrNZ9ZrYyWo+ZrmespstlWZf1vLZ7zli9Wi7uVax7Nlvez8R6ltNaNcd4r8pMzqpVza6r5fTaxL3rzijvTeaYblZkWV1qMqfKaN1nZ8tNrlXMVMv7maqudJbmu7Peu5LRvV1XS8U98Et+/r8pVzEfz0zmdZnqjNo5U/Ws3s2ZXEfey/LTGSY7Y7pz1RnXnTVX7hXt1K2m9epsJ56pZjxyn+oeVd3Y9apfyXpe2z1nujPOMtPzq3nTOcZqWq+uI+9VmclZtap181zMVGemc703meOstpoZ+1fnZLTenXdV/o75kxmR9WJf96uz+m8mmxXz3Xk1zQHfiIdyscpP5nWZ6ozaOVP1srrWJtdRzMVsVst4Jjtfqc647qy5cq/oyr2912Uq8czk/rv3qe5R1U12j1XfdWd3z5nujFnNjvXpvKg75z3N7ObV5Kxa1bp5LmaqM9O53pvMiXbO3DXHaL2b66r8HfMnM6KsN72n96bzq3x3Xk1zwDf66f+jZ6T91by4N1lGxX0my0xrLruv1qprE/cmy0xqGc9k2VXNrmMmq0VZf1pz2X2ymtJel8tk98pMc5ksu6pl94v9mDFZzcSzUXXOdf0rs6fz1ORMzGRntFbNrOpmNdPFWjfTTPOT3Cpj++ycq3p3zTGTWd15o/3qWj0y39i+O7PKV+ezc1GVmWQzkwzwrb7qoVyX16KY04xem5jp+llGr43mKlXG61U/ilk9U107P+crmtYqXdbv6SvK+llOaVZ5vepHWV7PZX0V+1nGxX6Vzep+Vlcmq09qPtPr2tearkrsTc+peMZXFGtdLi6vZ7SuZ2I9qrImy5uqbrLeTi0ul+0zWd3P+oqyvuayfiXmNK89rWeybHYm5jQzuVZZ3Wpxuayu/UyX15quzDRTiedjVvexB3y7r3kox+fgi/Z78bMFcBXfH/h1PJTjpfjS/W78fAFcxfcHfh0P5XgpvnS/Gz9fAFfw3QHwUI4XsS9cvnS/Hz9jAACu4aEcAAAAOIyHcgAAAOAwHsoBAACAw3goBwAAAA7joRwAAAA4jIdyAAAA4DAeygEAAIDDeCgHAAAADuOhHAAAADiMh3IAAADgMB7KAQAAgMN4KAcAAAAO46EcAAAAOIyHcgAAAOAwHsoBAACAw3goBwAAAA7joRwAAAA4jIdyAAAA4DAeygEAAIDDeCgHAAAADuOhHAAAADiMh3IAAADgMB7KAQAAgMN4KAcAAAAO46EcAAAAOIyHcgAAAOAwHsoBAACAw3goBwAAAA7jofwBf/39z38vvNbuZ37yZ8TvB/Ddpv85wHcBgJWveyj3L0hdz6Bzn3WPO7zitU3vcddr2Z3z7M/A5lf3eMa9u/s90/SeJ17bI/T1Tl57l7nrvducuO42nXl37pvsvOdf/HwA7Pmqh/JXfum96xfsiddl91zdd5KZ2p1z130r3Xt7xr27+01dOT+57x2v7ZWy1zp5j5U73rvNeOQ1VK6+tunruTr/k+2851/8fADs+ZqH8ld/4b3rF+yJ12X3XN13kpnanXPXfTM6O7vP3fde3W/qylk7szo3ybyT7LVO3mPljvc+mXHlPldfm51bnZ1kvtHOe/7FzwfAnq94KN/9svP/APGlfL/KdH0Te5rJ8ibL2L+xrktl9Zgxmot933eZSM9kur7VdGViX3PdGZdlrKZLdb1I+1nWaz7Ll5pknNazzPScr0h7se/7WHdV3/a6lO8fzbgq49da1350V8/2ulTVi7koO2O03vVczBjNeT/+G1V92+tSvn8046qMX8f6HXymzs5qLtt32awXcwC+y889lGfZ+KUXM1XNdT0Tz8e+i5kqp2Jmd2+0ZtfZmeyc816VqfpZfpWxvdayGabLZHuvxd6K5rOzOlvFc6uMi+eirGZifXpWa36d5cyq7+LMLL+bMdnea3rt4l7d0duZYfvpWbPqm+wearV3Xr/ad9q36yy/mzHZ3mt63fFctjo7/eo6ij3bd3kA3+OnHsonX4RVJtZ1X12ruzJRzHX7bqb3qszkrIm5qjeZV2Umc6rMKl/1M1k21rp5k3tqL8vFWjVrlavOGe9ppjvfzTLTrPceyXT9ydzMtFflpnXb785Q2Tyl+25el5vOMNOs9x7JTGbcYTVf+9W12q0D+C48lP/Le9MvRd1X1+qujLGeLtXtY095r8pMzpqYq3qTeVVmMqfK2HW1nF53slysdbO8N8mYLBdr1axVrjpnvKeZ7nw2y2q6XJZ13ptmquX9KKu5u3rVfauVyepdVpfq9rGnutxqhtV0uSzrvDfNVMv7z5TN19eg/ZiNe6Pn4gLw/Xgo/5f3qkys6766VndkrBbrO/vYU96rMpOzrpql+8m8KjOZU2WqfGS5Luv9ajm9jrw3zXTL6bWK9dVeea86082y61W/4r1HMybrT+ZmdntW03p3vhLPZPtJRuk+9lR1bjVv1a9479GMWfWd5arV0X6Wj/0onskyAH7HVzyUm8mXWZfxXpWJdd1X1+qOzKTW7bPzzntVZnLWVbN0P5lXZSZzqkyVr0zmR9P7ee+ujKlysb7aK+9VZ7pZsWdWfee9RzMm60/mZh7tdZlKPLPam50z2XlXndudt+o77z2aMav+o3R+dq9V33mvywD4fl/1UD75QssyWqtmxHp3JtvH/CQTrc6Y3b3RWtY3Vd2sZrpYu5Kxvdbi3mQZFfedKtvNiPfOslcyldWsqhatanecsX3sx4zZzZgs4ybnVdczu/OM9ldZZdmYn+yvnMlk9VUtmx37MWN2MybLuK53B52fva6ur67kAHyfr3kod/alFVfU9bO86XJZT5fX1Cqj16o7Y7RnYt94JmZNljdan5zZqemKsn7MrTJ67TTvK6u76rriGf1Xl1pl9LoS87q8prSnvJ71q3yUnfPle6c1XWqScTHjOf9XZTWnvSpndV3Rbt8zVV1l9Ziv+i72jWc0W+WiWPMZXte+1nSpScbFjOf832eJ87v7x2tdUex7xv8F8J2+7qH8XfFlisov/25M3vszP59sNn+rz3f65/6J+DyA78dD+YvwhYrKL/9unH44y2bzt/p8p3/un4jPA/h+PJS/AF+m6Pzy78c7PJzpfP5WX+Mdfu4A8G54KH8C+w8TXUDnl39HJu+dv6Hvw88dAP43HsoBAACAw3goBwAAAA7joRwAAAA4jIdyAAAA4DAeygEAAIDDeCgHAAAADuOhHAAAADiMh3IAAADgMB7KAQAAgMN4KAcAAAAO46EcAAAAOIyHcgAAAOCo//qv/wsjL589mRrhBgAAAABJRU5ErkJggg==" alt="" />
    所以这道题是我面试必选题之一!!凡是在ABP项目里面使用MapTo扩展方法而不是使用IObjectMapper的,绝对是没写过单元测试的!这样子一下就可以判断出面试者有没有写过单元测试了!!!
  3. 为啥你讲了这么多测试方面的知识,开发的知识却很少?
    答:因为:
    1. 无论是TDD还是BDD,都是测试驱动,先写测试代码然后再写业务开发代码
    2. 讲ABP开发的文章太多,不缺我一个,然而讲用ABP去做BDD/TDD的文章却很少,很需要我去补充
    3. 我现在自己创业,自负盈亏,不像很多开发人员,每月固定有工资,旱涝保收,可以放心的去空谈理论。所以我一切以出活为主,以交付实际成果为第一目标,而不是以理论和空谈为目标。BDD/TDD可以避免把宝贵的时间投入到项目实际上不需要的理论方面,可以保证我做的东西是客户所想要的。所以我强烈推荐BDD这个核武器。
    4. 在上一点里面我说出了核心,如何保证你所做的东西就是客户想要的?这就是BDD与TDD相比,BDD最大的优点啦!!!毕竟,绝大多数情况下,业务人员会比开发人员更了解业务!
 

BDD实战篇 - .NET Core里跑Specflow - 可以跑集成测试和单元测试的更多相关文章

  1. BDD实战篇 - 在.NET Core下安装Specflow

    这是<如何用ABP框架快速完成项目 >系列中的一篇文章. BDD很赞!比TDD先进很多,能够大大提高编码效率. 让我们动手起来吧!先在.NET Core下安装Specflow! 官网教程在 ...

  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  3. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  6. 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序

    如何在Visual Studio 2017中使用C# 7+语法   前言 之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法,然后闲来无事,搞着,搞着没搞出来,然后就写了这篇博文,不 ...

  7. 2天驾驭DIV+CSS (实战篇)(转)

     这是去年看到的一片文章,感觉在我的学习中,有不少的影响.于是把它分享给想很快了解css的兄弟们.本文是实战篇. 基础篇[知识一] “DIV+CSS” 的叫法是不准确的[知识二] “DIV+CSS” ...

  8. javamail模拟邮箱功能--邮件回复-中级实战篇【邮件回复方法】(javamail API电子邮件实例)

    引言: JavaMai下载地址l jar包:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...

  9. javamail模拟邮箱功能获取邮件内容-中级实战篇【内容|附件下载方法】(javamail API电子邮件实例)

    引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...

随机推荐

  1. Aseprite入门:第一个gif动图

    前言:Aseprite入门教程 1.新建图片: 选择新建文件,然后选定宽高和颜色及背景类型,点击OK进行图片的创建: 2.绘制一个基础图形,为了方便还是选用球形: 填充上颜色: 美化(添加阴影增加小球 ...

  2. 如何解决git====push 过程中出现的。error: failed to push some refs

    当我们在利用git  push 文件到仓库时出现了一下问题: ! [rejected] master -> master (fetch first)error: failed to push s ...

  3. Ubuntu 18.04搭建Git服务器

    学习链接:博客园.廖雪峰 一 前言 前面已经贴了两个链接,为什么还要再写一篇呢,因为可能由于个人能力问题,我觉得上面两篇写的都有点简略,有些地方不太好理解,并不能一次性成功搭建,所以想根据自己踩过的坑 ...

  4. ajax实现异步前后台交互,模拟百度搜索框智能提示

    1.什么是异步?在传统的网站项目中,填写一堆数据,最后点击提交,在点击提交的这一刻才实现数据提交,前后台交互.在你点击提交之前数据是没有提交到后台的.这样就会造成很大的不便.比如,我填了一大堆数据,结 ...

  5. Linux 下 Shell 的自动交互

    在编写脚本的时候经常会遇到这种情况,某些程序的命令执行的之后可能会要求用户进行输入,这个时候就需要一些特殊写法来应对这种问题了.这里参考 这篇文章提到可以使用 delimiter 分界符来解决. 也就 ...

  6. visual Studio 2017 扩展开发(二)《菜单图标详解》

    在上一篇我们在菜单栏创建了一个菜单,菜单上显示了一个图标跟文本.那么我们自己创建的菜单如何修改自定义的菜单图标呢.下面娓娓道来..... 首先你要有一个图,创建一个32位的位图.这个位图的像素是16p ...

  7. Docker学习之3——容器

    容器(Container) 容器介绍: docker是通过容器来运行业务的,就像运行一个kvm虚拟机是一样的.容器其实就是从镜像创建的一个实例. 我们可以对容器进行增删改查,容器之间也是相互隔离的.和 ...

  8. [译].NET Framework 4.8发布

    原文地址:https://devblogs.microsoft.com/dotnet/announcing-the-net-framework-4-8/ 我们很高兴地宣布今天发布.NET Framew ...

  9. 第一册:lesson nineteen。

    原文:tired and thirsty. A:What's the matter,children? B:We are tired and thirsty. A:Sit down,here. Are ...

  10. Easyui input 取值跟赋值

    var val = $("#id").textbox('getValue')  //取值 $("#id").textbox('setValue','text') ...