小编Mis*_*tyK的帖子

使用DI和IoC的工厂方法

我熟悉这些模式,但仍然不知道如何处理以下情况:

public class CarFactory
{
     public CarFactory(Dep1,Dep2,Dep3,Dep4,Dep5,Dep6)
     {
     }

     public ICar CreateCar(type)
     {
            switch(type)
            {
               case A:
                   return new Car1(Dep1,Dep2,Dep3);
               break;

               case B:
                   return new Car2(Dep4,Dep5,Dep6);
               break;
            }
     }
}
Run Code Online (Sandbox Code Playgroud)

通常,问题在于需要注入的引用量.当有更多的汽车时会更糟.

我想到的第一种方法是在工厂构造函数中注入Car1和Car2,但它违反工厂方法,因为工厂将始终返回相同的对象.第二种方法是注入servicelocator,但它的反模式到处都是.怎么解决?

编辑:

替代方式1:

public class CarFactory
{
     public CarFactory(IContainer container)
     {
        _container = container;
     }

     public ICar CreateCar(type)
     {
            switch(type)
            {
               case A:
                   return _container.Resolve<ICar1>();
               break;

               case B:
                     return _container.Resolve<ICar2>();
               break;
            }
     }
}
Run Code Online (Sandbox Code Playgroud)

替代方式2(由于树中的依赖性过多而难以使用):

public class CarFactory
{
     public CarFactory()
     {
     }

     public ICar CreateCar(type)
     {
            switch(type)
            { …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection inversion-of-control factory-pattern

36
推荐指数
2
解决办法
3万
查看次数

LINQ性能计数vs Where和Count

public class Group
{
   public string Name { get; set; }
}  
Run Code Online (Sandbox Code Playgroud)

测试:

List<Group> _groups = new List<Group>();

for (int i = 0; i < 10000; i++)
{
    var group = new Group();

    group.Name = i + "asdasdasd";
    _groups.Add(group);
}

Stopwatch _stopwatch2 = new Stopwatch();

_stopwatch2.Start();
foreach (var group in _groups)
{
    var count = _groups.Count(x => x.Name == group.Name);
}
_stopwatch2.Stop();

Console.WriteLine(_stopwatch2.ElapsedMilliseconds);
Stopwatch _stopwatch = new Stopwatch();

_stopwatch.Start();
foreach (var group in _groups)
{
    var count = _groups.Where(x => …
Run Code Online (Sandbox Code Playgroud)

c# linq

29
推荐指数
2
解决办法
3755
查看次数

在ASP.NET Core Process中创建的子进程在退出时被杀死

我正在使用Process类在ASP.NET Core(.NET Framework)中生成子进程:

var process = new Process
            {
                StartInfo = new ProcessStartInfo(executableDir)
                {
                    Arguments = commandDefinition.CommandDef.ArgumentsAsString,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    WorkingDirectory = _contentPath,
                },
            };

process.Start()
Run Code Online (Sandbox Code Playgroud)

据我所知,当父(ASP.Net Core)进程被杀死时,子进程应该保持活跃状态​​.我使用两个控制台应用程序测试了这种行为,并且在杀死父进程后,子进程永远不会被杀死 但是,当我在ASP.NET Core中生成一个新进程时,子进程在以下情况下被杀死:

  • IIS回收应用程序.
  • MSDeploy发布了新版本的ASP.NET Core应用程序.
  • 使用dotnet watch时,应用程序在代码更改期间重新启动.

如果通过任务管理器杀死父级,它不会被杀死.(经过一些测试后并非总是如此)

从上面我怀疑ASP.NET Core中有一种机制可以在成功退出时杀死所有子进程.它在某处记录了吗?有没有办法避免它?我找不到有关此类行为的任何信息.

编辑:repro实际上非常简单.

  1. 创建ASP.NET核心项目(.NET Framework或.NET Core,无关紧要)
  2. 将以下代码添加到您的Startup班级
  3. 启动网络应用.它将在IIS Express下托管.计算过程将开始.现在要么通过任务管理器杀死你的应用程序,要么通过IIS express托盘图标关闭它.
  4. 计算过程将被杀死.(有时您需要尝试刷新离线网页)
 var process = new Process
 {
      StartInfo = new ProcessStartInfo("calc.exe")
      {
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false, …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net-web-api

21
推荐指数
1
解决办法
1062
查看次数

Visual Studio 2015 WPF XAML编辑器无法打开XAML文件

我最近从Visual Studio 2015更新到Visual Studio 2015 Update 2(专业版).一切正常,除了我无法打开XAML文件 - 点击任何XAML文件后我得到:

Visual Studio has encountered an unexpected error.
Run Code Online (Sandbox Code Playgroud)

看起来尚未安装XamlDesignerPackage.HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\ _下存在XamlEditor条目,并且存在下 HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\可能表明此Visual Studio 2015未安装XAML Designer.

我尝试了一切:

  • 4重新安装
  • 清洁缓存
  • 删除ComponentDataCache
  • 重置设置.

在Visual Studio 2013中一切正常.有没有办法使用VS2013的XAMLEditor?你有什么想法我能做什么吗?我会很高兴得到任何帮助,因为它阻止我工作.这是ActivityLog.xml的错误:

507 2016/04/04 13:15:58.450错误VisualStudio SetSite包[XamlDesignerPackage]失败[方法因意外错误代码50失败.]:{at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType,Boolean isContainer,String在System.Security.AccessControl.FileSecurity的System.Security.AccessControl.FileSystemSecurity..ctor(Boolean isContainer,String name,AccessControlSections includeSections,Boolean isDirectory)中的name,SafeHandle句柄,AccessControlSections includeSections,Boolean createByName,ExceptionFromErrorCode exceptionFromErrorCode,Object exceptionContext). Microsoft.VisualStudio的Microsoft.VisualStudio.DesignTools.HostUtility.Utils.HostAppPackageAclService.CheckAclsOnDirectory(String目录)中的Microsoft.VisualStudio.DesignTools.Utility.IO.AccessHelper.IsAccessibleByAllApplicationPackages(String path)中的.ctor(String fileName,AccessControlSections includeSections). DesignTools.HostUtility.Utils.HostAppPackageAclService.V alidateOrUpdateDirectoryAcls在Microsoft.VisualStudio.DesignTools.HostUtility.Utils.HostAppPackageAclService.ValidateOrUpdateAclsNoPrompt(IEnumerable`1路径)(字符串目录)在Microsoft.VisualStudio.DesignTools.DesignerContract.IsolatedDesignerService.Initialize()在MS.Internal.Package.XamlDesignerPackage.Initialize( )
在Microsoft.VisualStudio.Shell.Package.Microsoft.VisualStudio.Shell.Interop.IVsPackage.SetSite(IServiceProvider sp)} {512BE089-83EC-4CC6-8483-CF16565AE209}


80131509方法因意外错误代码50而失败.

编辑:

我发现上面guid存在HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\编辑条目下.看起来设计器尚未安装,因为它存在于vs 2013中.必定存在冲突.

编辑:我已删除2013和2015并安装2015并在运行Visual Studio 2015时收到以下消息:

在此输入图像描述

c# wpf visual-studio visual-studio-2015

12
推荐指数
1
解决办法
2387
查看次数

异步等待MVVM XAML应用程序

我试着理解如何在我的ViewModel中使用async/await模式接收初始数据.我们来看看代码:

public interface IPeopleService
{
     Task<IEnumerable<Person> GetPeopleAsync();
}


public MainViewModel
{
    public ObservableCollection<Person> People{get;set;}

  public MainViewModel(IPeopleService peopleService)
  {
       LoadMyData(peopleService);
  }

    public async Task LoadMyData(IPeopleService peopleService)
    {
       try
       {
          People = await peopleService.GetPeopleAsync();
       }
       catch(Exception e)
       {
         //log       
         //notify user    
       }
    }

}
Run Code Online (Sandbox Code Playgroud)

PeopleService包含People Data的异步方法.注入IOC(无论如何).之后我调用异步操作LoadMyData(以防止阻塞UI,因此没有await关键字),并且在该方法中,我从服务中调用异步操作来捕获所有异常并且不对用户进行操作.这种方法有什么问题?

我从msdn阅读文章:https://msdn.microsoft.com/en-us/magazine/dn605875.aspx当我注意到为这种任务创建一个泛型类并更改我的所有属性以将该类用作泛型参数,更改XAML Bindings以接收Property.Result属性,我认为这很疯狂并且在项目中造成了很大的混乱.此外,ViewModel中的属性指定此属性是异步的,在我看来是糟糕的设计.什么是最简单的方法来解决我的问题?我的解决方案是否可以保持简单?

c# wpf asynchronous mvvm async-await

7
推荐指数
1
解决办法
8556
查看次数

Dotnet 构建不适用于 newcsproj 和 PackageReference

重现步骤:

  1. 打开Visual Studio 2017,创建新的类库项目,.NET 4.6.1.
  2. 添加对Newtonsoft.JsonNuget 包管理器的引用。
  3. 使用 成功构建项目VS2017
  4. 打开命令行并dotnet build从项目目录运行。

它给出以下错误:

错误 CS0246:找不到类型或命名空间名称“Newtonsoft”(您是否缺少 using 指令或程序集引用?)

点网版本: 在此输入图像描述

有什么想法可以摆脱这个错误吗?

编辑:在运行 dotnet Restore 之前:

在此输入图像描述

运行 dotnet Restore 后

在此输入图像描述

使用文件编辑:ClassLibrary1.csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{42A41D81-0A26-4D79-935E-6002BFAD37EB}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>ClassLibrary1</RootNamespace>
    <AssemblyName>ClassLibrary1</AssemblyName>
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup> …
Run Code Online (Sandbox Code Playgroud)

.net c#

7
推荐指数
1
解决办法
6471
查看次数

从 4.6.1 项目引用 .net framework 4.7.2 程序集

我正在尝试将针对 4.7.2 .NET 框架的 dll 添加到针对 4.6.1 .NET 框架的项目中。令人惊讶的是它工作正常,我一直认为不允许引用比当前项目构建更高版本的 .NET 框架 dll。.NET 4.0 和 4.5 就是这种情况,您现在可以这样做而不会出现任何问题吗?我找不到任何解释这一点的 MSDN 页面。但是在我的构建服务器上我得到:

无法解析主要引用“***.dll”,因为它是针对“.NETFramework,Version=v4.7.2”框架构建的。这是比当前目标框架“.NETFramework,Version=v4.6.1”更高的版本。

为什么我在构建服务器上收到此错误?(Windows Server 2012) 而我在我的本地机器上没有得到它?影响这一点的一个因素是 4.7.2 没有安装在构建服务器上,但它安装在我的机器上。为什么它甚至在本地允许?

.net c# msbuild

6
推荐指数
0
解决办法
1635
查看次数

AWS KMS 手动密钥轮换和旧加密数据

我尝试按照指南为上传到 AWS S3 的数据启用客户端加密: https: //docs.aws.amazon.com/sdk-for-net/v3/developer-guide/kms-keys- s3-加密.html。我在 KMS 中创建了一个 CMK,并禁用了自动轮换和别名test。一切正常,我可以将加密数据上传到 s3,然后从 s3 解密。我尝试按照此处的指南执行手动轮换: https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html(手动轮换密钥)根据文档,我需要创建一个新的 KMS 密钥并将别名更新为test. 现在我想获取并解密已上传到 s3 但使用旧密钥加密的数据。我得到这个(我在应用程序中使用别名而不是 keyId):

The key ID in the request does not identify a CMK that can perform this operation
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为它是一个不同的密钥,如果我可以使用任何密钥来解密数据,那就很奇怪了。据我所知,通过自动旋转,您可以免费获得此行为,但是手动旋转呢?我需要解密所有数据并使用新密钥对其进行加密吗?也许我可以以某种方式使用相同的密钥材料创建一个新的 KMS 密钥,以便它的工作方式与自动轮换类似?

误导性部分是文档页面上的注释

Note
When you begin using the new KMS key, be sure to keep the original KMS key enabled so that AWS KMS can decrypt data that the original KMS key encrypted.
Run Code Online (Sandbox Code Playgroud)

这表明我只需更改别名并且应该能够使用新的 CMS …

c# encryption amazon-s3 amazon-web-services

6
推荐指数
1
解决办法
1099
查看次数

Redux-form 6.0+ 更改所有字段值

我正在尝试以 redux-form 更改多个值。我将它们放在一个对象中,所以基本上我想用我的对象值覆盖 redux-form 状态值。实现它的一种方法是运行this.props.reset()后跟this.props.change()每个属性的多个事件。它可以工作,但它发送的事件太多并且速度很慢。我尝试的第二件事是运行this.props.initialize(data,false),这有效,但不会重新运行验证,因此我可以轻松提交表单而无需验证。有没有办法运行一个事件来用我的对象覆盖表单状态?

javascript reactjs redux redux-form

5
推荐指数
1
解决办法
3035
查看次数

具有文件和json属性的ASP.NET Core和formdata绑定

我有以下模型:

public class MyJson
{
 public string Test{get;set;}
}

public class Dto
{
 public IFormFile MyFile {get;set;}
 public MyJson MyJson {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在客户端,我想发送一个文件和一个json。所以我用以下键在formData中发送它:

var formData = new FormData();
formData["myFile"] = file//here is my file
formData["myJson"] = obj; // object to be serialized to json.
Run Code Online (Sandbox Code Playgroud)

我的动作如下所示:

public void MyAction(Dto dto) // or with [FromForm], doesn't really matter
{
  //dto.MyJson is null here
  //dto.myFile is set correctly.
}
Run Code Online (Sandbox Code Playgroud)

如果我将其更改dto.MyJson为字符串,则可以正常工作,但是在操作中必须手动将其反序列化为对象。将其作为字符串的第二个问题是,我不能使用swagger UI来正确处理它,因为它将要求我提供json字符串而不是对象,无论如何,将其作为字符串听起来并不对。是否有本机方法可以正确处理操作参数中的json和文件,而不是使用手动解析它Request.Form

c# asp.net json

5
推荐指数
1
解决办法
2221
查看次数