我试图找出如何最好地实现扩展方法,以在我的库用户可能希望覆盖各种接口的某些默认实现时注册服务。似乎有两种处理方法。
第一种方法是在扩展方法内部使用services.TryAdd,这将使您能够在调用主扩展方法之前通过使用services.Add注册替代实现,以便您的实现首先到达那里。这行得通,因为如果接口已经注册了某些东西,.TryAdd将不会添加。
如果扩展方法使用普通的旧服务.Add而不是.TryAdd,则您仍然可以覆盖实现,但是现在您必须在调用添加了默认实现的主扩展方法之后注册实现。
在我看来,第一种方法似乎更好。如果调用services.Add,使用接口的不同实现多次添加,则它们都会被注册,并且您实际上可以依赖于该接口的IEnumerable来获取所有它们。但是,如果您确实只需要在应用程序中实现一个,那么最好不要在集合中包含任何其他实现。显然,如果该应用程序确实使用了该接口的多个实现,则您需要添加所需的所有实现。
我想知道是否就此或建议达成共识,还是仅取决于个人口味。
我是 F# 新手,正在尝试将一些 C# ASP.NET Core 代码转换为 F#
即使我让它工作了,我似乎无法弄清楚如何使控制器动作异步。这些方法在注入的 Commands 对象和 Queries 对象上调用异步代码。命令和查询目前是用 C# 实现的。
例如,几个异步 C# 控制器方法是:
public async Task<IEnumerable<ToDoItem>> Get()
{
return await queries.GetAll();
}
[HttpGet("{id}", Name = "GetTodo")]
public async Task<IActionResult> GetById(string id)
{
var item = await queries.Find(id);
if (item == null)
{
return NotFound();
}
return new ObjectResult(item);
}
public async Task<IActionResult> Create([FromBody] ToDoItem item)
{
if (item == null)
{
return BadRequest();
}
if (string.IsNullOrEmpty(item.Id)) item.Id = Guid.NewGuid().ToString();
await commands.Add(item); …Run Code Online (Sandbox Code Playgroud) stackoverflow 上也有类似的问题,但这些问题的答案对我不起作用,所以请不要将其标记为重复。
在我的 cms 中,我希望人们能够添加 SPA(单页应用程序)内容页面。此类应用程序通常只有一个具有某些属性的 div,并且使用 javascript 将应用程序加载到该 div 中。因此,我希望用户能够创建仅包含一个空 div 且具有如下属性的内容:
<div data-cscal-eventsource="default" data-cscal-height="550" id="eventCal" class="cs-eventcal"></div>
Run Code Online (Sandbox Code Playgroud)
然而ckeditor(我现在使用的是4.6.2版本)总是删除空的div。通过谷歌搜索并在这里找到类似的问题,我在配置中尝试了各种方法:
allowedContent : true
Run Code Online (Sandbox Code Playgroud)
应该关闭所有过滤,但它仍然被删除。
CKEDITOR.dtd.$removeEmpty['div'] = false;
Run Code Online (Sandbox Code Playgroud)
在一些答案中也找到了,但对我不起作用。
在将 allowedContent 设置为 true 之前,我尝试使用 extraAllowedContent 进行各种操作,如下所示:
extraAllowedContent: 'div(*){*}[*]; ol li span a(*){*}[*]'
Run Code Online (Sandbox Code Playgroud)
如果 div 有一些文本,它的工作方式如下:
<div data-cscal-eventsource="default" data-cscal-height="550" id="eventCal" class="cs-eventcal">hello</div>
Run Code Online (Sandbox Code Playgroud)
但我不想要该文本,并且使用 nbsp 也不起作用。
我怎样才能让 CKEditor 留下我的空 div 呢?我的 div 是编辑器中的唯一内容,我的 SPA 的脚本和 css 是从编辑器外部添加的。我只需要能够添加 div 而不将其删除。我正在尝试使用 sourcedialog 添加 div。
我不想修改 ckeditor 源代码来解决这个问题。
为了清晰起见,我的完整代码是这样的,您可以在评论中看到我尝试过的一些事情:
(function ($) {
var xsrfToken = $('[name="__RequestVerificationToken"]:first').val();
var dfUrl …Run Code Online (Sandbox Code Playgroud) 将我的应用程序从asp.net core 2.1更新到2.2后,似乎默认路由操作不适用于单独类库中的控制器。
例如,我有一个像这样的默认路由:
routes.MapRoute(
name: "default",
template: "{controller}/{action}"
,defaults: new { controller = "Home", action = "index" }
);
Run Code Online (Sandbox Code Playgroud)
在我的类库中,我有一个控制器SiteAdminController,它具有Index动作方法。
当我访问url / siteadmin时,我得到的是HomeController索引,而不是SiteAdminController的index操作
如果我使用/ siteadmin / index,那么它可以工作
如何在不要求在URL中显式执行index操作的情况下使其工作?在2.1中工作正常
在project.json文件中我们有一个依赖项部分,然后我们还有一个框架部分,在每个框架下可以有更多的依赖项.我很困惑为什么有时依赖关系需要进入框架部分,而其他时候需要进入主依赖关系部分?
例如,在我的几个项目中,我在dnxcore50下有依赖项,但是当我从nuget升级它们时,它将升级版本放在主依赖项部分中,并在框架部分下留下旧版本的较低版本.
一般来说,我发现很容易出错并在VS 2015中为一个或另一个框架获得奇怪的依赖解析错误,并且很难弄清楚导致错误的原因.我有时会在一个项目中添加一个依赖项,并在另一个项目中导致错误,在链中的多个包中找到类型或者解决基本基本类型的问题.
似乎VS 2015模板可能会将它们放在不同的地方与使用nuget添加引用时,或者因为我使用的是beta5,VS中的工具有点不同步.
是否有任何指导何时将依赖项放在主依赖项部分和特定于框架的部分下?
在之前的beta4和beta5中,我能够使用以下代码插入自定义RazorViewEngine:
services.AddMvc().Configure<MvcOptions>(options =>
{
options.ViewEngines.Clear();
options.ViewEngines.Add(typeof(MyViewEngine));
});
Run Code Online (Sandbox Code Playgroud)
但是在升级到beta6之后,现在它说MvcOptions上没有ViewEngines
我尝试通过DI添加它,就像这样:
services.TryAdd(ServiceDescriptor.Transient<IRazorViewEngine, MyViewEngine>());
Run Code Online (Sandbox Code Playgroud)
但没有运气.有谁知道实现这一目标的新方法是什么?