当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();
});
}
答案 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"
};
}
}
就是这样,你得到了每个人都创建的新实例。