c# - Asp.Net Core RC1 -> RTM DI 更改 - 从服务中删除

标签 c# dependency-injection asp.net-core structuremap4

我在 AspNet Core 1.0 RTM 中使用结构图。看来他们已经使用属性上的 FromServices 属性删除了。这会破坏下面的代码,因为我现在无法注入(inject) ClaimsPrincipal。我不确定如何让 DI 系统获取此属性。我是否需要创建自定义 InputFormatter 或其他东西。要使它再次运行似乎需要做很多工作。

Startup.cs

public class Startup {
    public IServiceProvider ConfigureServices(IServiceCollection services) {
        var container = new Container();
        container.Configure(i => {

            i.For<IHttpContextAccessor>()
                .Use(new HttpContextAccessor());

            i.For<ClaimsPrincipal>()
                .Use(x => x.GetInstance<IHttpContextAccessor>().HttpContext.User);
        });

        container.Populate(services);

        return container.GetInstance<IServiceProvider>();
    }
}

模型.cs

public class Model {
    //[FromServices] <-- worked in RC1
    public ClaimsPrincipal Principal { get; set; }

    public string Value => Principal.Identity.Name; 
}

TestController.cs

public class TestController : Controller {

    public IActionResult Test(Model model){
        return Ok();
    }
}

最佳答案

据我所知,它被删除的主要原因之一是围绕它工作和不工作的混淆。例如,FromServices 是 MVC 的模型绑定(bind)概念,一些用户尝试在 MVC 之外使用它,但发现它不起作用。

但是,您可以创建自己的模型绑定(bind)属性来实现类似的行为。

例如,这适用于模型上的装饰。注意我还没有在 Controller 的属性上测试机智。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FromDIAttribute : Attribute, IBindingSourceMetadata
{
    public BindingSource BindingSource { get { return BindingSource.Services; } }
}

public class Customer
{
    [FromDI]
    public IFooService FooService { get; set; }

    public string Name { get; set; }
}

更新:

在此处找到有关其删除的公告:https://github.com/aspnet/Announcements/issues/115

关于c# - Asp.Net Core RC1 -> RTM DI 更改 - 从服务中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38338833/

相关文章:

c# - 使用字符串的依赖注入(inject)(ninject),反模式?

C#VSTO : Coloring pivottable cells

c# - 删除大文本文件中的所有重复项

c# - 通用子 C# 的通用父级

java - 使用 Guice,如何注入(inject)父类(super class)的构造函数参数?

java - Dagger:多次注入(inject)的类中没有可注入(inject)成员

c# - 如何获取我在 Asp.Net 核心的 Startup.ConfigureServices 中添加的所有授权策略?

C# ASP.NET Core 2.1/ Entity Framework : Entity collention dosen't saving

c# - 如何将自定义模型绑定(bind)器与 Swashbuckle、Swagger 和 NSwag 一起使用?

C# ASP.NET cs0246 问题