精华内容
下载资源
问答
  • dotnet IOC容器

    2019-07-16 10:12:37
    dotnet IOC容器 企业库 Unity Spring.net 转载于:https://www.cnblogs.com/FredChan/archive/2010/07/27/1786145.html

    dotnet IOC容器

    企业库 Unity Spring.net

    转载于:https://www.cnblogs.com/FredChan/archive/2010/07/27/1786145.html

    展开全文
  • DotNetCore容器

    2021-08-01 18:56:42
    以前没用DotNetCore之前我用spring.net。spring.net的容器在xml配置好对象然后加载容器后就可以使用。配置类型下面: <?xml version="1.0" encoding="utf-8"?> <objects xmlns='...

    以前没用DotNetCore之前我用spring.net。spring.net的容器在xml配置好对象然后加载容器后就可以使用。配置类型下面:

    <?xml version="1.0" encoding="utf-8"?>
    <objects xmlns='http://www.springframework.net' default-autowire="byType">
      <!--这个配置文件主要用来配置系统的业务服务类,不要删除、修改提交其他人添加的配置,新加配置提交时主要同时提交配置使用的动态库,-->
      <!--否则会造成其他人更新后报错-->
      <!--检验数据访问层底层-->
      <object type="LIS.DAL.Base.CacheBaseLIS,LIS.DAL.Base"  singleton="false">
      </object>
    </objects>
    

    到DotNetCore之后发现往容器加对象竟然是代码直接写的,而且编译才生效。类似下面:

    services.AddSingleton(LIS.DAL.ORM.DBUtility.IDbFactory, LIS.DAL.Base.CacheBaseLIS);
    

    当时就想,我去,这设计师脑子被驴踢了吗!这么写死了算什么IOC,根本没法解耦啊!

    后面发现被踢的是我,不得不服设计水准。因为设计师不想把配置固化,就给你提供基础容器,你想用什么表示配置自己自由发挥,给大家留了大舞台。自己可以根据需要把接口和实现类关系配置在xml、json、txt、数据库等等。通过读取配置然后反射调用方法往容器投入。

    比如我就通过反射从asmx提取配置然后注入容器,用SOAPCore发布webservice,强行模拟了DotNet时代asmx的效果。

    /// <summary>
    /// 通过asmx文件把wbservice对象加入IOC容器
    /// <%@ WebService Language="C#"  Class="LIS.BLL.WebService.LISFileService" %>
    /// </summary>
    /// <param name="services"></param>
    public void WebServicesToIoc(IServiceCollection services)
    {
        //webservice文件地址
        string asmxPath = Path.Combine(AppContext.BaseDirectory, LIS.Core.MultiPlatform.LISConfigurtaion.Configuration["StaticFilesPath"], "service", "asmx");
        //尝试一下开发目录
        if (!Directory.Exists(asmxPath))
        {
            DirectoryInfo di = new DirectoryInfo(AppContext.BaseDirectory);
            asmxPath = Path.Combine(di.Parent.Parent.FullName, LIS.Core.MultiPlatform.LISConfigurtaion.Configuration["StaticFilesPath"], "service", "asmx");
        }
        if (Directory.Exists(asmxPath))
        {
            DirectoryInfo asmxdi = new DirectoryInfo(asmxPath);
            FileInfo[] asmxFiles = asmxdi.GetFiles();
            if (asmxFiles != null && asmxFiles.Length > 0)
            {
                foreach (FileInfo fi in asmxFiles)
                {
                    if (fi.Extension == ".asmx")
                    {
                        string confStr = LIS.Common.TxtUtil.ReadTxt(fi.FullName);
                        string cFlag = "Class=\"";
                        int cStartIndex = confStr.IndexOf(cFlag);
                        int cEndIndex = confStr.IndexOf('"', cStartIndex + cFlag.Length);
                        string className = confStr.Substring(cStartIndex + cFlag.Length, cEndIndex - cStartIndex - cFlag.Length);
                        string[] classArr = className.Split('.');
                        string assemblyName = "";
                        for (int ci = 0; ci < classArr.Length - 1; ci++)
                        {
                            if (assemblyName == "")
                            {
                                assemblyName = classArr[ci];
                            }
                            else
                            {
                                assemblyName += "." + classArr[ci];
                            }
                        }
                        Type serviceType = LIS.DAL.ORM.DBUtility.RefectUtil.GetType(className, assemblyName);
                        services.AddSingleton(serviceType, serviceType);
                    }
                }
            }
        }
    }
    

    他的设计思想应该就是提供最单纯的容器,一边让你注册,一边让你获取。至于你注册的类型从哪来那是你的自由。如果没能体会这个意图,就会和我开始那些,这算哪门子容器IOC,分明是强耦合啊。

    一个简单可靠的容器,不用整花里胡哨的配置,提供配置了就得提供各种各样的格式支持,还把人的发挥限制死了。这就是他比spring.net的高明之处

    展开全文
  • dotnet runtime 的容器中安装 dotnet global tool.pdf
  • dotnet runtime 的容器中安装 dotnet global toolIntro.NET Core 从 2.1 开始支持 Global tool, 借助 global too...

    在 dotnet runtime 的容器中安装 dotnet global tool

    Intro

    .NET Core 从 2.1 开始支持 Global tool, 借助 global tool 我们可以通过命令行来实现很多功能,微软提供的一系列的 dotnet 诊断工具也都提供了 global tool,我们可以通过 global tool 比较方便的进行使用,

    但是 global tool 默认是只能装了 SDK 之后才能装,在实际的生产环境我们一般都是使用只包含 runtime 的 docker 镜像,没有 SDK 就不能直接安装 global tool,那我们要怎么做才能在只有 runtime 的 docker 镜像中使用 global tool 呢?且看下面的介绍

    Global tool

    dotnet global tool 是框架依赖发布的,所以是需要依赖运行时的,如果 dotnet tool 依赖的运行时找不到的时候,会尝试使用高版本的 runtime,遵循前滚(roll-forward)规则

    • 应用程序前滚至指定的主要版本和次要版本的最高修补程序版本。

    • 如果主要版本号和次要版本号没有匹配的运行时,则使用下一个较高的次要版本。

    • 前滚不会发生在 runtime 的预览版本,也不会发生在预览版和正式版之间。因此,使用预览版创建的 .NET  global tool 必须由作者重新生成和重新发布,再重新安装。

    在下面两种常见的场景下默认不会发生 roll-forward :

    • 只有低版本运行时可用时,roll-forward 只会选择之后的版本,低版本不会被选择

    • 只有更高的主要版本运行时可用时,roll-forward 默认不会跨越主要版本的边界,主要版本发生变化有些 API 可能会有不兼容的变更

    如果找不到一个合适的 runtime 版本,会运行失败并抛出错误信息。

    我们可以通过 dotnet --info 或者 dotnet --list-runtimes 来查看已有的 runtime 信息

    Install dotnet global tool

    通过 dotnet tool install --global dotnet-dump 我们就可以安装 dotnet-dump 这个 global tool 了,但是就像前面提到的,我们必须要安装 SDK 才能安装 global tool,但是其实 global tool 运行的时候只依赖于 runtime,这就有点“悖论”了,明明我只需要 Runtime 就可以运行的,但是要安装 SDK 才能安装,在 Github 上提了一个 issue,有需要的可以关注一下:https://github.com/dotnet/sdk/issues/18168

    在网上 Google 之后就会发现有一些解决方案,大体上分为两类,一种是直接安装 SDK 或使用 SDK 的环境,第二种则是在 SDK 的环境下安装 global tool,装好之后把 global tool 拷贝到只有 runtime 的环境中

    Docker practice

    在 docker 环境中,我们可以结合默认的多阶段构建的方案,在 build 镜像中安装 dotnet global tool,在最后拷贝发布内容的时候同时也拷贝 dotnet global tool

    Dockerfile 示例如下:

    FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build-env
    WORKDIR /app
    
    # install dotnet tool
    RUN dotnet tool install --global dotnet-dump
    
    COPY SparkTodo.Shared/SparkTodo.Shared.csproj SparkTodo.Shared/
    COPY SparkTodo.API/SparkTodo.API.csproj SparkTodo.API/
    RUN dotnet restore SparkTodo.API/SparkTodo.API.csproj
    
    # copy everything and build
    COPY . .
    
    WORKDIR /app/SparkTodo.API
    RUN dotnet publish -c Release -o out
    
    # build runtime image
    FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine
    LABEL Maintainer="WeihanLi"
    WORKDIR /app
    COPY --from=build-env /app/SparkTodo.API/out .
    COPY --from=build-env /root/.dotnet/tools /root/.dotnet/tools
    ENV PATH="/root/.dotnet/tools:${PATH}"
    EXPOSE 80
    ENTRYPOINT ["dotnet", "SparkTodo.API.dll"]
    

    通过多阶段构建的方式,我们可以避免直接使用特别大的 SDK 镜像,通过这种方式安装 dotnet tool 镜像只会增加几十M的大小(我装了一个 dotnet-dump,具体还是要看 dotnet tool 的大小)

    通过 docker run --rm --name sparktodo sparktodo-api 运行一个容器,然后通过 docker exec -it sparktodo sh 进入到容器内部,然后就可以测试我们安装的 dotnet global tool 了

    可以看到我们安装的 dotnet global tool 已经可以正常使用了

    More

    我们在 Dockerfile 里安装了 dotnet global tool 并使用了默认的 dotnet tool 的路径,并配置了环境变量以便于可以直接使用 dotnet global tool,如果需要也可以配置 dotnet tool 的安装路径,通过 dotnet tool install --global dotnet-dump --tool-path /usr/bin 来指定自定义的路径

    References

    • https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools

    • https://docs.microsoft.com/en-us/dotnet/core/tools/troubleshoot-usage-issues

    • https://docs.microsoft.com/en-us/dotnet/core/deploying/#publish-framework-dependent

    • https://andrewlock.net/running-net-core-global-tools-in-non-sdk-docker-images/

    • https://github.com/dotnet/sdk/issues/18168

    • https://github.com/WeihanLi/SparkTodo/blob/master/Dockerfile

    展开全文
  • docker4dotnet #2 容器化主机.pdf
  • 本指南介绍如何使用容器开发基于微服务的应用程序并对其进行管理。 本指南探讨使用 .NET Core 和 Docker 容器的体系结构设计和实现方法。
  • docker4dotnet #2 容器化主机

    千次阅读 2016-07-20 18:15:16
    上篇《docker4dotnet #1 前世今生&世界你好》中给大家介绍了如何在Windows上面配置Docker for Windows和Docker Tools for Visual Studio来使用docker协助.NET Core应用的开发,这篇我们来看看如何创建和管理容器化...

    .NET 猿自从认识了小鲸鱼,感觉功力大增。上篇《docker4dotnet #1 前世今生&世界你好》中给大家介绍了如何在Windows上面配置Docker for Windows和Docker Tools for Visual Studio来使用docker协助.NET Core应用的开发,这篇我们来看看如何创建和管理容器化主机。

    所谓容器化主机Dockerized Host,就是安装了docker engine的主机,可以使用docker工具进行管理。使用docker来协助开发,我们至少需要本地和云端的容器化主机,本地用于开发,测试,打包;云端的用于生产环境发布。使用容器化主机我们可以将所有的环境标准化,也即是使用统一的docker工具来完成容器在不同环境中的迁移(搬运),真正将容器化开发的优势发挥出来。dockerized-env

    使用docker发布应用与以往的应用发布方式有很大不同,从上图中可以看出。

    • 因为应用本身与依赖,应用服务器和操作系统都是分离的;我们在自动化过程中就必须处理各种不同的场景,难以标准化;而使用容器技术,我们就可以将自动化简化为对容器的搬运。
    • 各种依赖的解决都集中在开发环境中完成,常见的npm,nexus, nuget等工具都是开发人员很熟悉的,这些依赖的获取都可以由开发人员自己解决,在后续的自动化中无需再次处理。
    • 仅从自动化的复杂程度来说,你可以很明显的看出传统开发中自动化会变成各种复杂情况的汇聚点,这就是为什么做CI/CD需要如此复杂的工具;如果再考虑不同种类的工具,如:Jenkins/TeamCity/Travis,Chef/Puppet等,这个环境会变的非常难以控制和维护。
    • 以往我们必须给不同的应用创建不同的运行环境,而且这个环境必须从操作系统开始一层层搭建;使用容器话之后,不同类型的应用可以运行在统一的操作系统层之上,大大提高了资源利用率和灵活性。

    在不同的环境中统一使用容器化主机就是向着容器化开发演进的第一步,也是大幅降低自动化系统复杂程度的第一步。

    创建容器化主机

    今天给大家介绍一下docker工具集中用来管理容器化主机的工具 docker-machine。上一篇文章中我们提到 Docker for Windows 其实是在 Hyper-V 中创建了一台运行着 docker daemon 守护程序的 linux vm 来接收 windows 命令行中运行的 docker 指令的,在你第一次启动 docker for windows 的过程中, docker-machine 工具完成了这个 vm 的初始化工作。

    这个初始化的操作很简单,如果你已经安装了 docker for windows,可以打开命令行(注意:一定要用管理员权限),然后键入如下命令;

    docker-machine create --driver hyperv {machine-name}

    d4d-2-001

    这样,docker-machine 就完成了在你本地的hyper-v上初始化一台可以运行容器的vm(一般称为Dockerized host 容器化主机)的工作了。

    注:在以上过程中如果docker-machine无法在本地找到boot2docker.iso这个文件的话,会从网络上下载,这个过程会很慢,我已经将这个文件上传到了 d4dtools 的网站盘中,请在公众号中输入 d4dtools 获取。

    下载后放入当前用户的~\.docker\machine\cache\ 这个目录即可。

    完成初始化后,如果你希望让docker命令直接对这个新的主机进行操作,可以运行下面的命令。

    @FOR /f "tokens=*" %i IN ('docker-machine env {machine-name}') DO @%i

    注意将{machine-name}替换成你自己的容器化主机名称,这个命令会设置以下三个环境变量

     SET DOCKER_TLS_VERIFY=1
     SET DOCKER_HOST=tcp://xxx.xxx.xxx.xxx:2376
     SET DOCKER_CERT_PATH=C:\Users\LeiXu\.docker\machine\machines\{machine-name}
     SET DOCKER_MACHINE_NAME={machine-name}

    完成后如果运行 docker 命令,那么你所使用的就是新的容器化主机了。

    Docker-Machine 的环境驱动

    上面的命令中你会注意到 –driver hyperv 这个参数,docker 提供了很多驱动可以让你在不同的环境中一键创建容器化主机,这些环境包括:

    – Virtual Box (virtualbox)
    – Hyper-V (hyperv)
    – Azure (azure)
    – Aws (amazonec2)
    – VMware Fusion (vmwarefusion)
    – VMware vCloud Air (vmwarevcloudair)
    – Vmware vSphere (vmwarevshpere)
    – …

    括号中的内容就是驱动的命令参数,完整的列表可以访问:
    https://docs.docker.com/machine/reference/create

    另外,阿里云也提供了driver,不过并不在docker 官方列表中
    https://github.com/denverdino/docker-machine-driver-aliyunecs

    小编测试了以下几个环境

    d4d-2-002

    Azure 国际版命令:

    docker-machine create --driver azure --azure-subscription-id {sub-id} --azure-open-port 80 {machine-name}

    Azure 世纪互联版命令:

    docker-machine create --driver azure --azure-environment "AzureChinaCloud" --azure-subscription-id {sub-id} --azure-open-port 80 --azure-location "ChinaNorth" {machine-name}

    AWS 国际版命令:

    docker-machine create --driver amazonec2 --amazonec2-region "ap-northeast-1" --amazonec2-vpc-id {vpc-id} {machine-name}

    这些命令都可以提供丰富的参数来控制主机的操作系统镜像,主机配置大小,网络连接,主机位置等。大家可以通过以下命令获取这些参数的详情:

    docker-machine create --driver {driver-name}

    这些主机创建好以后,如果要列出所有绑定到你自己环境上主机,可以运行:

    docker-machine ls

    如果你需要直接登陆到主机上进行操作,可以 运行:

    docker-machine ssh {machine-name}

    因为docker-machine在创建主机的过程中已经自动完成了public key的生成和配置,你无须输入用户名和密码就可以ssh进入主机进行操作,所有这些public key的证书文件都存放在 ~\.docker\machine的目录下面。

    注:因为网络的原因,这些操作有可能失败。如果遇到这种情况,先进入云平台的控制台查看相关的资源是否都创建成功呢了,如果已经资源已经在那里了。尝试运行:

    docker-machine regenerate-certs {machine-name}

    这样会强制宿主机的 docker deamon 重启,一般来说可以解决问题。

    使用docker-machine这个工具,你可以完成容器化主机的创建,启动,关闭等主要操作;而不必通过云提供商的控制台来完成,也就是说你本地的docker环境就变成中对于所有开发,测试和生产环境的控制台;通过docker所提供的命令,你可以完成从应用打包,环境创建,发布部署的整个过程。当然,如果你的团队比较大,其中的一些步骤还是需要借助自动化系统来完成,这样才能完成代码的集成和团队协同,安全性控制和集群环境的编排也是需要考虑的问题。这些,我们将在后续的文章中给大家提供解决方案。

    将应用发布到云端

    到了这里,小编到觉得没啥可说的了,docker的发布实在是简单!简单!简单!重要事情说三遍。

    进入你的应用目录调用那个 dockertask.ps1 脚本,就可以完成应用的打包和image上传操作

    .\DockerTask.ps1 -Build -Environment Release -Machine {machine-name}

    d4d-2-003

    然后运行

    docker images

    就可以看到已经上传到你的目标宿主机上面的 images,这时就可以运行 docker run 了 (注意:要确保你正确配置了 宿主机的环境变量)

    docker run -p 80:80 username/webapp01:latest

    d4d-2-004

    注:这个过程中你可能会碰到docker版本不匹配的问题

    d4d-2-005

    你可以安装 docker version manager 这个工具,然后使用以下命令来获取使用正确版本

    dvm install {version}
    dvm use {version}

    安装命令(Poweshell):

    Invoke-WebRequest https://download.getcarina.com/dvm/latest/install.ps1 -UseBasicParsing | Invoke-Expression

    小结

    到这里,我们就完成了本地和云端的docker环境的创建,并进行了最简单的应用部署。你可以看到,docker 提供了一套简单易用的工具和部署方式,让我们的应用开发,调试和打包部署都变的非常快捷。下一篇中我们将介绍如何使用macOS环境完成.net core应用的创建,调试和docker打包部署过程。


     

    请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的信息

    qrcode_for_gh_b7c158df1fd1_430

    展开全文
  • Dockerize.NET: 将.NET Core程序打包到docker容器中的.NET Cli工具:'dotnet dockerize'
  • 在使用 ASP.NET Core 的 docker 调试的时候,在生成的这一步提示 C:\Program Files\dotnet\sdk\3.1.201\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.targets(424,5): error MSB4018: “CreateAppHost”任务...
  • dockerWebApi 在Docker容器中运行的dotnet core 3.0 Web API 使用Github进行持续集成将Docker映像存储在Github Package Registry中的操作 使用Github操作向Azure容器实例进行连续部署
  • 测试容器 建置状态 NuGet软件包
  • 设置环境变量 environment { DOTNET_CLI_HOME = "/tmp/DOTNET_CLI_HOME" } 或者 export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME
  • choper-elk 是一个“集实现IOC容器与支持WCF多种协议”WCF服务容器的框架
  • 通常我们可以直接使用镜像microsoft/dotnet作为dotnetcore应用程序的基础镜像,可以直接使用Kerstrel作为Web服务器。但实际情况不总是这样,本文先介绍如何使用powershell将AspNetCore程序部署到IIS,然后在window ...
  • 做了个测试项目连接mysql,数据库还原好了,但是怎么就是连...首先修改项目配置文件数据库连接字符串Server为Sql Server容器的名字。 Server=MSSQL; Database=MyDb; User ID=sa;Password=QWER1234;MultipleActiveRes...
  • DotNET介绍

    千次阅读 2019-11-20 17:51:26
    一、.NET课程简介(DotNET全程) 1、DotNET是微软公司旗下的一种用作于软件网络开发的新型技术。 2、世界上最流行的操作系统是windows系统。 3、.NET Framework 是指DotNET的运行环境 二、C#语言 1、是微软旗下的...
  • 为了推广.Net Core,微软为我们提供了一个开源Demo-eShopOnContainers,这是一个使用Net Core框架开发的,跨平台(几乎涵盖了所有平台,windows、mac、linux、android、ios)的,基于微服务架构的,运行在容器中的...
  • Asp.net core的跨平台开发能力为.net开发人员提供了使用容器进行应用开发的能力,今天这篇文章将对如何使用微软的全生命周期管理平台VSTS/TFS来构建基于容器的CI/CD管道来支持团队开发的场景。 #1 前世今生 & ...
  • 上一篇AgileEAS.NET之插件接口IModule中我们介绍了EAS.NET模块插件契约,在本文我们将介绍一下调用插件的运行容器,即平台。 AgileEAS.NET平台最早是应用于基于WinForm技术开发管理信息系统应用的,所以基于WinForm...
  • .NET测试容器 .NET Testcontainers是一个库,用于支持对所有兼容.NET Standard版本的Docker容器的一次性实例进行测试。 该库基于.NET Docker远程API构建,并提供了轻量级的实现以在所有情况下支持您的测试环境。 从...
  • dotnet Docker 部署

    2019-08-20 11:04:28
    1、dotnet for docker 安装。在xshell中执行 docker pull mcr.microsoft.com/dotnet/core/sdk ;不要百度搜索命令,请找Docker 官网查找。百度搜到的命令可能已过期。 2、WebApi工程文件、添加Dockerfile文件。 ...
  • 我正在尝试将docker支持...在dotnet build命令期间失败,说它无法加载共享库kernel32.dll和libkernel32.dll.我有以下DockerfileFROM microsoft/dotnet:2.1-aspnetcore-runtime AS baseWORKDIR /appEXPOSE 80FROM micr...
  • DotNet微信公众号简介

    2019-06-22 22:06:08
    dotNET跨平台 DotNET技术圈 架构师修行之路 dotNET匠人 DotNetCore实战 角落的白板报 Excel催化剂 Magiccodes 草根专栏 寒树Office dotNET跨平台 《dotNET跨平台》是国内首个以.NET程序员、技术文化...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,864
精华内容 3,145
关键字:

dotnet容器