NET Core DI 中的 Autofac TypedParameter 等价物
Autofac TypedParameter equivalent in NET Core DI
我正在将 .NET Framework 项目迁移到 .NET 6。我们在 .NET Framework 项目中使用 Autofac 进行 DI,并期待迁移 MS.DI。在现有项目中,有一种方法可以在 运行 时间内解析对象时传递构造函数参数,我正在寻找一种在 MS DI 中执行相同操作的方法。
示例:
public interface IMemberProvider
{
long MemberId { get; }
}
public class FixedMemberProvider : IMemberProvider
{
public MemberProvider(long memberId)
{
MemberId = memberId;
}
public long MemberId { get; set; }
}
我是这样注册的,
builder.RegisterType<FixedMemberProvider>().As<IMemberProvider>()
.InstancePerLifetimeScope();
在中间件或任何我这样解决的地方,
using var messageScope = _lifetimeScope.BeginLifetimeScope();
if (!string.IsNullOrEmpty(message.MemberId))
messageScope.Resolve<IMemberProvider>(
new TypedParameter(typeof(string), message.MemberId));
所以在范围内我可以访问GetMemberId()
方法。谁能帮助 Microsoft DI 完成这项工作。
如果你想在ASP.NET核心中使用依赖注入,你可以阅读this。
下面是构造方法注入的demo,大家可以参考一下
ICounter.cs:
public interface ICounter
{
int Get();
}
Counter.cs:
public class Counter : ICounter
{
private int _count;
public int Get()
{
return _count++;
}
}
在下面添加到 Program.cs:
builder.Services.AddScoped(typeof(ICounter), typeof(Counter));
Controller.cs:
public class HomeController : Controller
{
private ICounter _counter;
public HomeController(ICounter counter)
{
_counter = counter;
}
public IActionResult Index()
{
int count = _counter.Get();
ViewBag.Count = count;
return View();
}
}
在中间件中使用 Scoped 对象,您可以在 InvokeAsync 方法中注入所需的对象。
TestCounterMiddleware.cs:
public class TestCounterMiddleware
{
private RequestDelegate _next;
public TestCounterMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context,ICounter counter)
{
int count = counter.Get();
await _next(context);
}
}
下面添加到Program.cs:
app.UseMiddleware<TestCounterMiddleware>();
结果:
基本Microsoft.Extensions.DependencyInjection解析时不支持参数。该容器旨在成为一个符合 lowest-common-denominator 的容器,可以由 any DI 容器支持,从 Autofac 到 Simple Injector。如果您想使用其他功能,这就是 特别是为什么 您可以使用更丰富的容器来支持它。如果您需要 Autofac 功能... use Autofac.
我正在将 .NET Framework 项目迁移到 .NET 6。我们在 .NET Framework 项目中使用 Autofac 进行 DI,并期待迁移 MS.DI。在现有项目中,有一种方法可以在 运行 时间内解析对象时传递构造函数参数,我正在寻找一种在 MS DI 中执行相同操作的方法。
示例:
public interface IMemberProvider
{
long MemberId { get; }
}
public class FixedMemberProvider : IMemberProvider
{
public MemberProvider(long memberId)
{
MemberId = memberId;
}
public long MemberId { get; set; }
}
我是这样注册的,
builder.RegisterType<FixedMemberProvider>().As<IMemberProvider>()
.InstancePerLifetimeScope();
在中间件或任何我这样解决的地方,
using var messageScope = _lifetimeScope.BeginLifetimeScope();
if (!string.IsNullOrEmpty(message.MemberId))
messageScope.Resolve<IMemberProvider>(
new TypedParameter(typeof(string), message.MemberId));
所以在范围内我可以访问GetMemberId()
方法。谁能帮助 Microsoft DI 完成这项工作。
如果你想在ASP.NET核心中使用依赖注入,你可以阅读this。
下面是构造方法注入的demo,大家可以参考一下
ICounter.cs:
public interface ICounter
{
int Get();
}
Counter.cs:
public class Counter : ICounter
{
private int _count;
public int Get()
{
return _count++;
}
}
在下面添加到 Program.cs:
builder.Services.AddScoped(typeof(ICounter), typeof(Counter));
Controller.cs:
public class HomeController : Controller
{
private ICounter _counter;
public HomeController(ICounter counter)
{
_counter = counter;
}
public IActionResult Index()
{
int count = _counter.Get();
ViewBag.Count = count;
return View();
}
}
在中间件中使用 Scoped 对象,您可以在 InvokeAsync 方法中注入所需的对象。 TestCounterMiddleware.cs:
public class TestCounterMiddleware
{
private RequestDelegate _next;
public TestCounterMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context,ICounter counter)
{
int count = counter.Get();
await _next(context);
}
}
下面添加到Program.cs:
app.UseMiddleware<TestCounterMiddleware>();
结果:
基本Microsoft.Extensions.DependencyInjection解析时不支持参数。该容器旨在成为一个符合 lowest-common-denominator 的容器,可以由 any DI 容器支持,从 Autofac 到 Simple Injector。如果您想使用其他功能,这就是 特别是为什么 您可以使用更丰富的容器来支持它。如果您需要 Autofac 功能... use Autofac.