使用Autofac进行物业注入并不起作用

时间:2017-06-23 14:57:29

标签: c# dependency-injection autofac

我一直在查看Autofac的示例和文档,但无法确保其正常运行。

我们有一个帮助类Core.Helpers.Tokens,其属性设置如下:

namespace Core.Helpers
{
    public static class Tokens
    {
        private static IConfigurationManager ConfigurationManager;

        public static string GetToken()
        {
            var sessionTokenName = ConfigurationManager.GetAppSetting("SessionTokenName");
            return (string) HttpContext.Current.Session[sessionTokenName];
        }
    }
}

配置设计如下:

namespace Core.Config
{
    public interface IConfigurationManager
    {
        //...
    }

    public class WebConfigConfigurationManager : IConfigurationManager
    {
        //...
    }
}

在我们的MVC网络应用程序中(引用并使用Core.HelpersStartup.cs我试图注册IConfigurationManager进行属性注入。

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var builder = new ContainerBuilder();

        // REGISTER CONTROLLERS SO DEPENDENCIES ARE CONSTRUCTOR INJECTED
        builder.RegisterControllers(typeof(MvcApplication).Assembly);
        builder.RegisterModule<AutofacWebTypesModule>();
        builder.RegisterFilterProvider();
        builder.RegisterType<WebConfigConfigurationManager>().As<IConfigurationManager>().PropertiesAutowired();

        RegisterTypes(builder);

        // BUILD THE CONTAINER
        var container = builder.Build();
        var webConfig = container.Resolve<IConfigurationManager>();

        // REPLACE THE MVC DEPENDENCY RESOLVER WITH AUTOFAC
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        // REGISTER WITH OWIN
        app.UseAutofacMiddleware(container);
        app.UseAutofacMvc();
    }

当Web代码调用GetToken时,ConfigurationManager为空。我错过了什么?

2 个答案:

答案 0 :(得分:1)

一个错误是您的Tokens.ConfigurationManager是私有字段,而属性注入适用于公共属性

此外,它必须是实例属性,而不是静态属性。所以最后它应该是

public IConfigurationManager ConfigurationManager{get;set;}

但这意味着你还必须注入一个Tokens实例,这将不再是一个静态助手类,你将不得不做一些重新设计,有一些选择:

  1. 如果您有一个IConfigurationManager实例,您希望从中调用GetTokens,您可以将其作为输入参数传递给GetTokens()
  2. 您将此静态帮助器提升为依赖项(例如ITokenService?),该依赖项将被注入到所需的任何位置。而不是让它静止, 您可以使用Autofac生命周期管理使其成为单身人士。 (可能是最好的解决方案)
  3. 最差解决方案,但最小的更改,即无需放弃这是一个静态帮助程序类的工作,是使属性使用DependencyResolver而不是注入,像:

    private static IConfigurationManager ConfigurationManager {get {return DependencyResolver.Current.GetService();}}

答案 1 :(得分:0)

您正在解析IConfigurationManager,您应该解析WebConfigConfigurationManager。

如果您有5个使用IConfigurationmanager的类,则解析该接口并不会告诉autoface您想要使用哪个具有此接口的具体类。