使用默认的 Asp.net Core IoC 容器,我是否可以保证如果为一个接口注册了多个对象类型,并且我为该接口请求服务,IoC 将始终返回为该接口注册的最后一个对象类型?
(我通读了 .Net Core Dependency Injection 文档,它似乎没有解决这个问题 。https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection)
假设我有这个界面:
interface ITest
{
void Create(int id);
}
Run Code Online (Sandbox Code Playgroud)
和这些课程:
public class TestOne: ITest {
int id;
public void Create(int id) {
this.id = id;
}
}
public class TestTwo: ITest {
int id;
public void Create(int id) {
this.id = id;
}
}
public class TestThree: ITest {
int id;
public void Create(int id) {
this.id = id;
}
}
Run Code Online (Sandbox Code Playgroud)
现在在 Startup.cs 的ConfigureServices …
背景
出于 SEO 目的,同一页面不能有两个 url 很重要,否则 Google 会将其中一个页面视为具有“重复内容”,这将导致 Google 降低该页面在搜索引擎结果中的排名。
问题
在 Asp.Net Core 中,当使用基于属性的例程时,如下所示:
public class ExampleController: Controller {
[HttpGet]
[Route("/example/")]
public IActionResult Index() {
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
此路由返回 index.cshtml 页面,以响应/example/ AND /example的 url 请求。但是,我只希望它响应我明确指定的路线,即/example/. 如果由于我不希望此操作方法响应而收到请求/example,则系统应该返回 404。
问题
我需要在全局级别做什么来强制路由引擎严格遵守指定的路由?
Tag Helper是Asp.Net Core的一个很好的功能.我创建了几个标记助手,它们可以提供超级帮助.
现在我想尝试一些更高级的东西.标记辅助属性具有以属性值是模型属性的方式创建的能力.
这方面的例子如下:
//model
public class MyModel{
public int MyField {get;set;} = 10;
}
//in the view
@model MyModel
...
<input asp-for="MyField" />
Run Code Online (Sandbox Code Playgroud)
在上面的示例asp-for中,input标记定向的标记帮助程序引用模型中的属性.该文件说,
asp-for属性值是ModelExpression和lambda表达式的右侧.因此,asp-for ="Property1"在生成的代码中变为m => m.Property1,这就是为什么你不需要使用模型前缀的原因.
所以这很酷,并且相同的文档似乎称之为"表达式名称".
如何在我自己的自定义标记帮助器中创建这样的属性?
如果我有这样的视图模型:
public class MyModel{
public DateTime? StartDate {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
在视图上,输入标记与asp-for标记助手一起使用,如下所示:
<input asp-for="StartDate" />
Run Code Online (Sandbox Code Playgroud)
由此生成的默认html是
<input type="datetime" id="StartDate" name="StartDate" value="" />
Run Code Online (Sandbox Code Playgroud)
但我希望它生成的是html,如下所示:
<input type="datetime" id="startDate" name="startDate" value="" />
Run Code Online (Sandbox Code Playgroud)
如何让asp-for输入标签帮助器生成像上面这样的驼峰案例名称,而不必使我的模型属性为camelCase?
这些说明https://www.microsoft.com/net/core#windows表示在Windows上安装.NET Core SDK 1.0 RC2之前,应通过"添加/删除程序"从Windows中删除所有以前版本的.NET Core.
但是,在从Windows 7中的"添加/删除程序"运行卸载并安装.NET Core SDK后,我发现我的/Program Files/DNX/文件夹仍然存在.
这让我想知道是否应该删除它以清理系统.但是,在使用DNX下使用RC1创建的旧项目时,可能需要它.
我想知道是否可以删除dnx文件夹及其相关的运行时?
有时控制器需要检查视图是否存在,以便它可以采取一些操作,如果不存在?
我见过类似的问题,Asp.Net MVC中是否存在视图?对于asp.net mvc的早期版本,但这些方法不适用于ASP.NET Core.我无法从控制器内部找到有关如何使用ASP.NET Core的任何文档.
鉴于以下内容:
string viewLoc= "~/views/some-folder/some-file.cshtml";
Run Code Online (Sandbox Code Playgroud)
控制器如何确定视图是否存在?
Microsoft.AspNetCore.Http.StatusCodes包含许多对于从控制器返回有用的状态代码常量,例如可以在控制器中像这样使用:
return StatusCode(StatusCodes.Status201Created);
Run Code Online (Sandbox Code Playgroud)
但奇怪的是,该类StatusCodes不包含 422 Unprocessable Entity 的值,至少在 Asp.Net Core 1.0.1 中没有。为什么不包含StatusCodes.Status422UnprocessableEntity?
这个 http 状态代码是否已被我不知道的某些规范贬值?还是有其他原因导致 422 Unprocessable Entity 未包含在内?
.net核心的美丽之处之一是它非常模块化且可配置。
这种灵活性的一个关键方面是,它通常通过接口利用IoC来注册服务。从理论上讲,这可以用很少的精力用该服务的自定义实现替换默认的.net服务。
从理论上讲,这听起来很棒。但是我有一个实际的工作案例,我想用我自己的默认替换.net核心服务,但我不知道如何删除默认服务。
更具体地说,在Startup.cs ConfigureServices方法中,当services.AddSession()调用时,它将注册一个DistributedSessionStorevai以下代码:
services.AddTransient<ISessionStore, DistributedSessionStore>();
Run Code Online (Sandbox Code Playgroud)
从源代码中可以看到:https : //github.com/aspnet/Session/blob/rel/1.1.0/src/Microsoft.AspNetCore.Session/SessionServiceCollectionExtensions.cs
我想用自己创建的ISessionStore替换它。因此,如果我有一个RonsSessionStore:ISessionStore要替换当前注册的ISessionStore的类,该怎么办?
我知道我可以ConfigureServices通过以下方法在Startup.cs 方法中注册ISessionStore :
services.AddTransient<ISessionStore, RonsSessionStore>();
Run Code Online (Sandbox Code Playgroud)
但是,如何删除已经注册的DistributedSessionStore?
我试图通过startup.cs ConfigureServices方法来完成此任务
services.Remove(ServiceDescriptor.Transient<ISessionStore, DistributedSessionStore>());
Run Code Online (Sandbox Code Playgroud)
但它没有任何作用,并且DistributedSessionStore仍在IoC容器中。有任何想法吗?
如何ConfigureServices使用startup.cs方法从IoC删除服务?
我是TypeScript的新手,仍在努力解决这个问题.我有一个使用jquery版本3.2.1的示例visual studio项目,我想让我的项目可以使用TypeScript类型定义.
从互联网上看,这些类型定义的权威来源似乎是https://github.com/DefinitelyTyped/DefinitelyTyped
在那页上,我读到了
npm
这是首选方法.这仅适用于TypeScript 2.0+用户.例如:
npm install --save-dev @ types/node
所以看起来我只需要键入npm install --save-dev @types/jquery以获取通过npm下载的jquery类型定义文件.但后来我问自己,嗯,我想知道如果每个人都在键入相同的命令而不管jquery版本,那么类型定义文件将是什么版本的jquery.所以我去了npm网站检查,奇怪的是它说
这个软件包包含的jQuery 1.10.x /(类型定义http://jquery.com/).
然而,最后一次更新是"最后更新:星期六,2017年3月11日00:13:28 GMT".
所以这看起来很奇怪,为什么最近会有一个针对jquery 1.10.x的npm模块的更新?为什么npm的jquery类型def的最新版本是针对这样一个旧版本的jquery?2.0也许只有1.10.x?所以我猜测也许这些类型的defs是最新的和最好的,谁维护npm包只是不更新摘要?但我怎么能证实呢?我下载了模块,并试图从类型defs的jquery版本中辨别出但是无法确定.
所以这是我的问题.一个人如何获得特定版本的Jquery,ex 3.2.1的TypeScript定义文件?
在 Visual Studio 2022 中,静态类名、静态方法和静态属性默认为粗体。例如,请参见此屏幕截图,静态方法GetRequired以及InTestMode静态属性和AppConfig静态类均以粗体显示:
我希望他们都不要大胆。但让我们暂时关注一下静态方法。我知道我可以进入Tools> Options> Environment>Fonts and Colors并更改各种文本元素的颜色配置,包括粗体。但是我找不到控制静态代码元素粗体的“显示项”。我已取消选中以“用户成员 - ”开头的所有“显示项目”的粗体,包括“用户成员 - 方法”的项目(如下所示)
但是,我在 C# 编辑器中仍然看到静态方法以粗体显示。哪一个“显示项目”是控制这种大胆处理的那个?或者有什么不同的方法来关闭这种大胆的治疗方法?
c# ×4
.net-core ×3
asp.net-core ×3
tag-helpers ×2
html ×1
jquery ×1
npm ×1
routes ×1
seo ×1
typescript ×1
url ×1