【问题标题】:Autofac property Injection in base controller基本控制器中的 Autofac 属性注入
【发布时间】:2014-12-31 03:40:25
【问题描述】:

我有基础控制器,我尝试了属性注入但不起作用......

public class BaseController : Controller
{
    public ILoggingService loggingService { get; set; }

    public BaseController()
    {

    }
}

这是我的 Autofac 配置...

var builder = new ContainerBuilder();

// builder.Register(c => new BaseController { loggingService = c.Resolve<ILoggingService>() });
builder.RegisterControllers(Assembly.GetExecutingAssembly())
                   .PropertiesAutowired();

builder.Register(c => new BaseController()).OnActivated(e =>
{
    e.Instance.loggingService = e.Context.Resolve<ILoggingService>();
});
builder.RegisterAssemblyTypes(Assembly.Load("Aizen.Services"))
                   .Where(t => t.Name.EndsWith("Service"))
                   .AsImplementedInterfaces()
                   .InstancePerRequest();

【问题讨论】:

  • 你不应该首先使用属性注入。构造函数注入是建议的常见做法。 Autofac 将支持开箱即用。

标签: c# asp.net-mvc dependencies autofac code-injection


【解决方案1】:

您尚未为ILoggingService 接口注册具体类型。没有它,Autofac 不知道将您的属性设置为实际需要什么。

添加这样的东西(当然是用真实的对象替换):

builder.RegisterType<YourLoggingServiceGoesHere>().As<ILoggingService>();

【讨论】:

  • 我有。我忘了在这里添加它。谢谢回答..但我有它。
  • 所以Aizen.Services 程序集包含ILoggingService 的实现?
  • 是的..我试过了——builder.RegisterType().As();
  • 我在你的代码中看不到,但你有没有做过类似的事情DependencyResolver.SetResolver(new AutofacDependencyResolver(builder.Build()));
【解决方案2】:

你可以试试这个解决方案:

builder.Register(c => new BaseController {  loggingService = c.Resolve<ILoggingService>() });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2011-03-10
    • 2020-02-23
    相关资源
    最近更新 更多