分类 C# 下的文章

Program.cs 中:

var serviceProvider = builder.Services.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<MyServices>>();
builder.Services.AddSingleton(typeof(ILogger), logger);

这样就会将 ILogger 注入到相关类中,可以直接通过构造函数来获取了:

private ILogger logger;
public void MyServices(ILogger logger)
{
    this.logger = logger;
    ...
}

Net core 6.0 中,要开启 GcServer 模式,需要通过环境变量的方式。

Windows 系统

直接增加环境变量(用户或系统自己看着办)

DOTNET_gcServer=1

在 Linux 中

如果是直接运行的程序,直接 export DOTNET_gcServer=1 就行
要永久生效,可以将这句加入到 ~/.bashrc (当前用户) 和 /etc/profile (全局) 中。

如果是 service 方式运行的话,上面的方式就不生效了,就需要这样做:

systemctl edit <service>

写入以下内容:

[Service]
Environment="DOTNET_gcServer=1"

错误内容:

提示:找不到导入的项目“C:\Program Files\Microsoft Visual
Studio\2022\Community\MSBuild\Microsoft\VisualStudio\v16.0\WebApplications\Microsoft.WebApplication.targets”。此外,已尝试在
$(MSBuildExtensionsPath32) - "C:\Program Files (x86)\MSBuild"
的回退搜索路径中找到“Microsoft\VisualStudio\v16.0\WebApplications\Microsoft.WebApplication.targets”。这些搜索路径在“C:\Users\Administrator\AppData\Local\Microsoft\VisualStudio\17.0_fa40166f\devenv.exe.config”中定义。确认
声明中的路径正确,并且该文件位于某个搜索路径中的磁盘上。

解决办法

修改 .csproj:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v16.0\WebApplications\Microsoft.WebApplication.targets" />

将路径中的 v16.0 改成:v$(VisualStudioVersion)

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" />

建类:ViewBagActionFilter

namespace MetaWeb.Core
{
    public class ViewBagActionFilter : ActionFilterAttribute
    {

        public ViewBagActionFilter()
        {
            //DI will inject what you need here
        }

        public override void OnResultExecuting(ResultExecutingContext context)
        {
            // for razor pages
            if (context.Controller is PageModel)
            {
                var controller = context.Controller as PageModel;
                controller?.ViewData.Add("Langs", Langs.instance());
                //also you have access to the httpcontext & route in controller.HttpContext & controller.RouteData
            }

            // for Razor Views
            if (context.Controller is Controller)
            {
                var controller = context.Controller as Controller;
                if(controller != null)
                    controller.ViewBag.Langs = Langs.instance();
            }

            base.OnResultExecuting(context);
        }
    }
}

Program.cs 中添加:

builder.Services.AddControllersWithViews(options => {
    options.Filters.Add<ViewBagActionFilter>();
});

新建处理类:

public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
    public string? TransformOutbound(object? value)
    {
        if(value == null) return null;
        string? result = value.ToString();
        if(result == null) return null;

        return Regex.Replace(result, "([a-z])([A-Z])", "$1-$2").ToLower();
    }
}

路由注入 Program.cs :

builder.Services.AddRouting(options => {
    options.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
    options.LowercaseUrls = true;
});

路由:

app.MapControllerRoute(name: "default", pattern: "{controller:slugify=Home}/{action:slugify=Index}/{id?}");