我熟悉这些模式,但仍然不知道如何处理以下情况:
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
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) 我正在使用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中生成一个新进程时,子进程在以下情况下被杀死:
如果通过任务管理器杀死父级,它不会被杀死.(经过一些测试后并非总是如此)
从上面我怀疑ASP.NET Core中有一种机制可以在成功退出时杀死所有子进程.它在某处记录了吗?有没有办法避免它?我找不到有关此类行为的任何信息.
编辑:repro实际上非常简单.
Startup
班级 var process = new Process
{
StartInfo = new ProcessStartInfo("calc.exe")
{
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false, …
Run Code Online (Sandbox Code Playgroud) 我最近从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.
我尝试了一切:
在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时收到以下消息:
我试着理解如何在我的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中的属性指定此属性是异步的,在我看来是糟糕的设计.什么是最简单的方法来解决我的问题?我的解决方案是否可以保持简单?
重现步骤:
.NET 4.6.1
.Newtonsoft.Json
Nuget 包管理器的引用。VS2017
。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) 我正在尝试将针对 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 没有安装在构建服务器上,但它安装在我的机器上。为什么它甚至在本地允许?
我尝试按照指南为上传到 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 …
我正在尝试以 redux-form 更改多个值。我将它们放在一个对象中,所以基本上我想用我的对象值覆盖 redux-form 状态值。实现它的一种方法是运行this.props.reset()
后跟this.props.change()
每个属性的多个事件。它可以工作,但它发送的事件太多并且速度很慢。我尝试的第二件事是运行this.props.initialize(data,false)
,这有效,但不会重新运行验证,因此我可以轻松提交表单而无需验证。有没有办法运行一个事件来用我的对象覆盖表单状态?
我有以下模型:
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# ×9
.net ×3
wpf ×2
amazon-s3 ×1
asp.net ×1
async-await ×1
asynchronous ×1
encryption ×1
javascript ×1
json ×1
linq ×1
msbuild ×1
mvvm ×1
reactjs ×1
redux ×1
redux-form ×1