困扰了我一天的问题终于在下班之前解决了!
想用Autofac搭一个框架,引入了Autofac、Autofac.Configuration、Autofac.Mvc5这几个包。然后用下面代码注册依赖注入:
public class AutofacIocConfig
{
/// <summary>
/// 用Autofac注册Assembly程序集依赖
/// </summary>
public static void RegisterAssemblyDependency()
{
var builder = new ContainerBuilder();
var assemblyList = AppDomain.CurrentDomain.GetAssemblies().ToList();
//
var repositoryType = typeof(IRepository);
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => repositoryType.IsAssignableFrom(type) && !type.IsAbstract && type != repositoryType)//IsAssignableFrom -- 确定当前Type的实例是否可以从指定Type的实例分配
.AsImplementedInterfaces()
.InstancePerLifetimeScope();//InstancePerLifetimeScope 保证对象生命周期基于请求
var serviceType = typeof(IService);
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => serviceType.IsAssignableFrom(type) && !type.IsAbstract && type != serviceType)//IsAssignableFrom -- 确定当前Type的实例是否可以从指定Type的实例分配
.AsImplementedInterfaces()
.InstancePerLifetimeScope();//InstancePerLifetimeScope 保证对象生命周期基于请求
builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
运行一些结果失败了!页面报错,
安全透明方法“Autofac.Integration.Mvc.RequestLifetimeScopeProvider..ctor(Autofac.ILifetimeScope)”尝试访问安全关键类型“Autofac.ILifetimeScope”失败。
如下图:
然后,就上网查各种资料,StackOverflow上貌似没有对症的。列一个类似的问题吧,方便不是我遇到的这种问题的查找。
StackOverflow (Inheritance security rules violated while overriding member: 'Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(System.Type)')
有一个是遇到相同问题的:http://www.cnblogs.com/wj-Mcat/articles/4840541.html#commentform 此链接中截图说的方法试过了,确实解决不了这个问题。可是按他说的在“联机”中查找,结果搜“Autofac”搜不到想要的结果。不过他分析的结果应该是正确的,就是引用的Autofac相关的包的版本的问题。我之前也是像他说的那样拷贝nuget.org网站上的命令来添加的。
于是按以下命令将Autofac相关的包全删了:
1、Uninstall-Package Autofac.Mvc5
2、Uninstall-Package Autofac.Configuration
3、Uninstall-Package Autofac
然后按以下命令重新引入:(注意:不加版本号,让nuget.org自己判断应该引用的版本!)
1、Install-Package Autofac (此步骤给我安装的版本是Autofac.3.5.2)
2、Install-Package Autofac.Configuration(此步骤给我安装的版本是Autofac.Configuration 3.3.0)
3、Install-Package Autofac.Mvc(这个命令会报错,找不到程序包“Autofac.Mvc”,这下不得不加版本号了)
鉴于之前在StackOverflow上看到的那个问题,安装Autofac.Mvc4有可能会出现另一个安全问题,所以我直接装的Mvc5,至于装Mvc4会不会报那个错误,我没有试,就不管了。
4、Install-Package Autofac.Mvc5(此步骤给我安装的版本是Autofac.Mvc5.3.3.4)
然后再运行,就没有再报错了,搞定!说起来是个很小的问题,但要解决的话,着实能耗费不少时间。
附:引入包的时候不加版本号,nuget.org会自己检查依赖项、判断应该引用的版本,如图:
所以,nuget.org还是挺智能的。
结束!