我有来自相同接口的服务
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
Run Code Online (Sandbox Code Playgroud)
通常,其他IOC容器Unity
允许您通过某些Key
区分它们来注册具体实现.
在Asp.Net Core中,我如何注册这些服务并在运行时根据某些键解决它?
我没有看到任何通常用于区分具体实现的Add
Service方法key
或name
参数.
public void ConfigureServices(IServiceCollection services)
{
// How do I register services here of the same interface
}
public MyController:Controller
{
public void DoSomeThing(string key)
{
// How do get service based on key
}
}
Run Code Online (Sandbox Code Playgroud)
工厂模式是唯一的选择吗?
Update1
我已经阅读了这里 …
请考虑以下代码:
private static void Main(string[] args)
{
var ar = new double[]
{
100
};
FillTo(ref ar, 5);
Console.WriteLine(string.Join(",", ar.Select(a => a.ToString()).ToArray()));
}
public static void FillTo(ref double[] dd, int N)
{
if (dd.Length >= N)
return;
double[] Old = dd;
double d = double.NaN;
if (Old.Length > 0)
d = Old[0];
dd = new double[N];
for (int i = 0; i < Old.Length; i++)
{
dd[N - Old.Length + i] = Old[i];
}
for (int i = 0; i …
Run Code Online (Sandbox Code Playgroud) 我已经开发了几年的winforms程序.我现在正在研究.NET核心(包括ASP.NET核心MVC).我正在寻找新的GUI桌面技术.在visual studio 2015 update 3中我看不到任何选项在.NET核心中制作GUI应用程序.我错过了什么?
我想使用.NET Core中的蓝牙LE功能(特别是BluetoothLEAdvertisementWatcher)来编写将信息记录到文件的扫描程序.这是作为桌面应用程序运行,最好是作为命令行应用程序运行.
System.IO.StreamWriter(string)这样的构造函数显然不可用.如何创建文件并写入文件?
我会很高兴能够做一个System.Console.WriteLine(字符串),但似乎在.NET Core下也没有.
更新:为了澄清,如果我有一个看起来像这样运行的程序没有错误,我将参加比赛.
using System;
using Windows.Devices.Bluetooth.Advertisement;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
BluetoothLEAdvertisementWatcher watcher = new BluetoothLEAdvertisementWatcher();
Console.WriteLine("Hello, world!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新2:这是project.json文件:
{
"dependencies": {
"Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0"
},
"frameworks": {
"uap10.0": {}
},
"runtimes": {
"win10-arm": {},
"win10-arm-aot": {},
"win10-x86": {},
"win10-x86-aot": {},
"win10-x64": {},
"win10-x64-aot": {}
}
}
Run Code Online (Sandbox Code Playgroud)
该命令的输出dotnet -v run
包含此错误消息:
W:\src\dotnet_helloworld>dotnet -v run
...
W:\src\dotnet_helloworld\Program.cs(2,15): error CS0234: The type or namespace name 'Devices' does …
Run Code Online (Sandbox Code Playgroud) appsettings
我的.Net核心应用程序中有3个特定于环境的文件
在project.json
我这样设置publishOptions
.(根据此处的建议)
"publishOptions": {
"include": [
"wwwroot",
"appsettings.development.json",
"appsettings.staging.json",
"appsettings.production.json",
"web.config"
]
},
Run Code Online (Sandbox Code Playgroud)
我有3个相应的启动类,它们使用适当appsettings
的环境
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true);
Run Code Online (Sandbox Code Playgroud)
但是,当我发布应用程序时,所有3个appsettings文件都会在所有环境中结束.如何发布特定于环境的appsetting文件?
我有ASP.NET核心应用程序(Web Api).该文档解释了如何使用多个环境,但是它无法解释aspnetcore_environment
在发布网站时如何设置.
因此,可以说,如果我有3个环境Development
,Staging
和Production
在经典的ASP.NET Web应用程序中,我用来创建3个构建配置.Development
,Staging
和Production
(如下图所示).然后是3个.pubxml
文件,每个配置一个.我是否也需要使用相同的方法进行ASP.NET Core
应用?
如何设置aspnetcore_environment
的.pubxml
文件?
如果问题1中指定的方法已经过时,那么替代方法是什么?(我使用Jenkins进行CI)
更新1
我知道我必须设置ASPNETCORE_ENVIRONMENT
但是我无法理解我们在哪里设置它?在开发过程中,我可以在配置文件中设置它launchSettings.json
,但问题是我们如何在发布到分段或生产时设置它?我们在目标服务器上设置环境变量吗?
更新2
我在这里找到了解释设置环境变量的不同方法的文章.这部分回答了我的问题.但是,当我发布应用程序时,发布过程不会在发布时遵循环境变量appsettings.{env.EnvironmentName}.json
我已为该问题创建了单独的帖子
configuration .net-core coreclr asp.net-core asp.net-core-1.0
我的最终目标是创建一个跨平台(非Web)控制台应用程序,所以我现在正在探索.NET Core.
在我之前的.NET项目中,我在Visual Studio中进行了所有开发,但我还创建了一个批处理/ MSBuild文件,因此我只需单击一下即可构建整个项目(包括设置,NuGet包,带二进制文件的zip文件等).这是以前项目的一个例子.
最后,我想用我的.NET Core测试项目做类似的事情.
但是现在我在第一步失败了:我无法在Visual Studio之外构建它,因此结果可以在没有安装.NET Core的另一台Windows机器上运行.
(在第一步中,我忽略了跨平台部分 - 我很乐意让它在Windows上运行)
我设法让它在Visual Studio 2015 Community Edition中运行如下:
在Visual Studio中创建新项目:"新建项目"⇒"Web"⇒"控制台应用程序(包)"
在Visual Studio中创建新的发布配置文件(菜单中的"Build"⇒"Publish").
这将创建一个PowerShell脚本(以及一个带有设置的XML文件)
当我再次在菜单中"构建"⇒"发布"时,Visual Studio显然会再次执行先前创建的PowerShell脚本.
结果略超过90 MB,由598个文件夹中的825个文件组成,如下所示:
当我将它复制到另一台机器上时(安装了Win 7/.NET 4/未安装的.NET Core ),它可以工作.
这个答案和这个答案听起来像我可以用来dnu publish
通过命令行获得相同的结果.
据我所知,.NET的核心部分仍移动的目标,现在,所以显然dnu
现在dotnet
不是.
所以我尝试为它执行dotnet publish
(并创建一个批处理文件):
dotnet publish "%~dp0\src\CoreTestVisualStudio" -c Release -r win7-x64 -o "%~dp0\release\cli"
Run Code Online (Sandbox Code Playgroud)
结果包含一个 …
我认为这是一个编译器错误.
使用VS 2015编译时,以下控制台应用程序编译并执行完美:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var x = MyStruct.Empty;
}
public struct MyStruct
{
public static readonly MyStruct Empty = new MyStruct();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是现在它变得很奇怪了:这个代码编译,但它会TypeLoadException
在执行时抛出.
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var x = MyStruct.Empty;
}
public struct MyStruct
{
public static readonly MyStruct? Empty = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你遇到同样的问题吗?如果是这样,我将在Microsoft提出问题.
代码看起来毫无意义,但我用它来提高可读性并实现消歧.
我有不同的重载方法,如
void DoSomething(MyStruct? arg1, string arg2)
void DoSomething(string arg1, string arg2) …
我们的项目结构如,
native.dll
: - 这包含用c\c ++编写的纯本机代码.这个native.dll使用*def文件公开了一些函数.
Wrapper Library(wrapper.dll compiled with .Net framework v4.0)
-为了使用的功能native.dll
,一个Wrapper lib(wrapper.dll)
是写在C++\CLI
使用:clr\oldsyntax
.此包装具有的所有代码Interoperability
和Marshalling
.
Application(Console App v4.0)
直接用于wrapper.dll
使用提供的功能native.dll
.
现在这个项目需要在.Net Core中运行.这意味着我们将有一个
.Net Core application
会reference wrapper.dll
,反过来会参考
native.dll
.
我知道这不会直接起作用.但问题是.Net Core(CoreCLR)是否支持 C++\CLI(clr\oldsyntax)运行时环境 ?
如果不是,该应用程序可能的解决方案是什么?
coreclr ×10
.net-core ×7
c# ×6
asp.net-core ×4
.net ×2
bluetooth ×1
c++-cli ×1
compiler-bug ×1
dnx ×1
managed-c++ ×1
roslyn ×1
unmanaged ×1