首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NET中的Autofac TypedParameter等效

NET中的Autofac TypedParameter等效
EN

Stack Overflow用户
提问于 2022-02-22 11:09:03
回答 2查看 467关注 0票数 0

我正在将.NET框架项目迁移到.NET 6中。我们在.NET框架项目中使用Autofac作为DI,并期待移动MS.DI。在现有的项目中,有一种在运行时解析对象时传递构造函数参数的方法,我正在寻找一种在MS DI中这样做的方法。

示例:

代码语言:javascript
复制
public interface IMemberProvider
{
    long MemberId { get; }
}

public class FixedMemberProvider : IMemberProvider
{
    public MemberProvider(long memberId)
    {
        MemberId = memberId;
    }

    public long MemberId { get; set; }
}

我是这样注册的,

代码语言:javascript
复制
 builder.RegisterType<FixedMemberProvider>().As<IMemberProvider>()
     .InstancePerLifetimeScope();

无论是在中间件还是在任何地方我都是这样解决的,

代码语言:javascript
复制
using var messageScope = _lifetimeScope.BeginLifetimeScope();

if (!string.IsNullOrEmpty(message.MemberId))
    messageScope.Resolve<IMemberProvider>(
        new TypedParameter(typeof(string), message.MemberId));

因此,在这个范围内,我可以访问GetMemberId()方法。有人能帮助微软DI完成这个任务吗?

EN

Stack Overflow用户

发布于 2022-02-22 13:11:34

如果您试图在ASP.NET核心中使用依赖项注入,则可以读取

下面是一个关于构造器方法注入的演示,您可以参考它。

ICounter.cs:

代码语言:javascript
复制
public interface ICounter
    {
        int Get();
    }

Counter.cs:

代码语言:javascript
复制
public class Counter : ICounter
    {
        private int _count;
        public int Get()
        {
            return _count++;
        }
    }

在Program.cs中添加以下内容:

代码语言:javascript
复制
builder.Services.AddScoped(typeof(ICounter), typeof(Counter));

Controller.cs:

代码语言:javascript
复制
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();
        }       
    }

使用中间件中的作用域对象,可以在InvokeAsync方法中注入所需的对象。TestCounterMiddleware.cs:

代码语言:javascript
复制
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中添加以下内容:

代码语言:javascript
复制
app.UseMiddleware<TestCounterMiddleware>();

结果:

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71220228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档