在Startup.cs中创建的.NET Core / Pass对象到所有依赖类

时间:2016-03-12 18:56:43

标签: dependency-injection asp.net-core

当http请求进入时,我想实例化一个类并将此实例传递给任何需要它的类。 例如,我有一个带有两个属性的自定义spark-1.6.1/bin/spark-submit --class "MyClass" --driver-memory 12g --master local[*] target/scala-2.10/simple-project_2.10-1.0.jar 类。根据请求参数和业务逻辑,我想设置Actions属性,任何需要此类的控制器或存储库都应该有权访问Actions属性。我无法使用“AddInstance”,因为ConfigureServices方法无法访问当前请求。

CustomerClass.cs

Customer

Startup.cs

public class CustomerClass
{
    public string UserName{get;set;}
    public string Actions{get;set;}
}

控制器

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<CustomerClass, CustomerClass>();
}
public void Configure(IApplicationBuilder app, CustomerClass cs)
{
    app.Use((context, next) =>
    {
        cs.UserName = context.User.Identity.Name;
        // cs.Actions = BUSINESSLOGICBASEDONREQUEST
        return next();
    });
}

3 个答案:

答案 0 :(得分:1)

如果要注入在中间件中创建的类,可以尝试这样的方法:

Startup.cs

services.AddScoped(prov => 
prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetMyObject());

GetMyObject()HttpContext

的扩展方法
public static MyObject GetMyObject(this HttpContext context)
{
    object myObj;
    if (context.Items.TryGetValue(Key, out myObj))
    {
        return myObj as MyObject;
    }

    return null;
}

然后在你的中间件中:

public async Task Invoke(HttpContext httpContext)
{
    MyObject myObj = new MyObject();
    // Your bussiness logic goes here.

    httpContext.Items[Key] = myObj;

    await next_(httpContext);
}

答案 1 :(得分:0)

另一种方法可能是将生成的Customer存储到items的{​​{1}}字典中,如下所示:

HttpContext

答案 2 :(得分:0)

step1:代替类定义ex:ICustomer

的接口

第2步: 在注入对象

时创建服务提供者并配置此提供者
df_to_string.show()

第3步,在startup.cs文件中,

public class InterceptServiceProvider : IServiceProvider
    {
        public object GetService(Type serviceType)
        {
           // you can do lot of stuff here based on serviceType
           return new CustomerClass {
                UserName = context.User.Identity.Name;
                Actions = "BUSINESSLOGICBASEDONREQUEST"
              };
        }
    }

就是这样,你得到了每个人都创建的新实例。