我一直在查看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.Helpers
,Startup.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
为空。我错过了什么?
答案 0 :(得分:1)
一个错误是您的Tokens.ConfigurationManager
是私有字段,而属性注入适用于公共属性。
此外,它必须是实例属性,而不是静态属性。所以最后它应该是
public IConfigurationManager ConfigurationManager{get;set;}
但这意味着你还必须注入一个Tokens实例,这将不再是一个静态助手类,你将不得不做一些重新设计,有一些选择:
最差解决方案,但最小的更改,即无需放弃这是一个静态帮助程序类的工作,是使属性使用DependencyResolver而不是注入,像:
private static IConfigurationManager ConfigurationManager {get {return DependencyResolver.Current.GetService();}}
答案 1 :(得分:0)
您正在解析IConfigurationManager,您应该解析WebConfigConfigurationManager。
如果您有5个使用IConfigurationmanager的类,则解析该接口并不会告诉autoface您想要使用哪个具有此接口的具体类。