gpt4 book ai didi

c# - 如何使用 Autofac 解决属性注入(inject)问题?

转载 作者:行者123 更新时间:2023-11-30 16:55:21 36 4
gpt4 key购买 nike

我有一个 MVC 网络应用程序,它使用 Autofac 在 Controller 中注入(inject)服务。

问题:我正在尝试对服务进行属性注入(inject),但失败了(属性始终为空)。

我的期望:我希望通过 Autofac 正确初始化该属性(不为空)。

示例:

  • 我正在尝试将 AliasesService 作为 IAliasesService 注入(inject)到 Controller 中。
  • AliasesService 依赖于 MailService。
  • MailService 是 AliasesService 的属性。
  • AliasesService 已正确实例化并传递给 MyController。
  • MailService 未正确实例化并设置为 AliasesService 的属性

Controller :

public class MyController: Controller
{
private IAliasesService AliasesService { get; set; }

public MyController(IAliasesService aliasesService)
{
AliasesService = aliasessService;
}

public ActionResult Index()
{
var model = aliasesService.GetUserRoles();

return View();
}
}

全局.asax:

var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();

builder.RegisterType<MailService>().As<IMailService>();
builder.RegisterType<AliasesService>().As<IAliasesService>().PropertiesAutowired();

var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

别名服务:

public class AliasesService
{
public IMailService MailService { get; set; }

public Dictionary<int,string> GetUserRoles()
{
MailService.SendMail("method GetUserRoleshas been called");
return null;
}
}

值得一提:

  • 如果我尝试为 Controller 进行属性注入(inject),它会按预期工作
  • 构造函数注入(inject)有效,但我需要属性注入(inject)。

还有哪些我尝试过但没有成功的事情:

1

builder.RegisterType<MailService>()
.As<IMailService>();
builder.Register(c => new AliasesService()
{
MailService = c.Resolve<IMailService>()
})
.As<IAliasesService>();

2

builder.RegisterType<MailService>()
.As<IMailService>();
builder.RegisterType<AliasesService>()
.WithProperty("MailService", new MailService())
.As<IAliasesService>();

最小示例:

using Autofac;

namespace ConsoleApplication1
{
public interface IBar
{
}

public class Bar: IBar
{
public string Text { get; set; }

public Bar()
{
Text = "Hello world!";
}
}

public interface IFoo
{
}

public class Foo: IFoo
{
public IBar Bar { get; set; }
}

public class Program
{
public static void Main(string[] args)
{
var builder = new ContainerBuilder();

builder.RegisterType<Bar>().As<IBar>();
builder.RegisterType<Foo>().As<IFoo>().PropertiesAutowired();

var container = builder.Build();

var foo = container.Resolve<IFoo>();
}
}
}

备选方案:

对于最小的示例,Autofac 可以工作,但在 Controller 的上下文中,我仍然无法使其按预期工作,所以我放弃了使用它,因为我浪费了太多时间。我目前正在使用 CaSTLe Windsor,它可以满足我的所有需求,感谢您的支持。

最佳答案

在您的最小代码示例中,Bar 属性声明为未注册的 Bar 类型。应注册声明的属性类型,以便让 Autofac 解析它。您应该将属性的类型更改为 IBar 或将 Bar 注册为 Bar

public class Foo : IFoo
{
public IBar Bar { get; set; }
}

builder.RegisterType<Bar>().As<Bar>();

关于c# - 如何使用 Autofac 解决属性注入(inject)问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29624136/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com