我正在构建一个连接到MS SQL 2008数据库的MVC5 Web应用程序,以便用户可以搜索并更改存储在那里的数据。我看过一堆autofac教程和示例,但似乎无法使它们工作。
我假设我的autofac配置是问题,因为当我运行应用程序时它说我的模型为空。我认为这意味着autofac没有连接到数据库。
因此,在我的global.asax.cs
文件中,我有以下内容:
protected void Application_Start()
{
#region Autofac
// Register Controllers
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly); //all controllers in assembly at once ?
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterFilterProvider();
// Set the Dependency Resolver
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
// Register Model Binders
builder.RegisterModelBinders(typeof(MvcApplication).Assembly); //all binders in assembly at once ?
builder.RegisterModelBinderProvider();
// Register Modules
builder.RegisterModule<PersistenceModule>();
#endregion
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
我有hibernate.cfg.xml
个文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Data Source=DEVSRV\SQLSERVER;Initial Catalog=tipdemo;Persist Security Info=True;User ID=admin;Password=***********</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<!--<mapping assembly="NHibernateTest"/> -->
</session-factory>
</hibernate-configuration>
</configuration>
我的PersistenceModule
课程是:
public class PersistenceModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
if (builder == null)
throw new ArgumentException("builder", "builder is null");
base.Load(builder);
}
private ISessionFactory ConfigureDB()
{
Configuration cfg = new Configuration().Configure(System.Web.HttpContext.Current.Server.MapPath("~/Config/hibernate.cfg.xml"));
cfg.AddAssembly(typeof(Domain.General.Project).Assembly);
return cfg.BuildSessionFactory();
}
}
答案 0 :(得分:2)
在构建完成后,您无法在容器中注册内容。
在Application_Start
示例中的第11行,您正在构建容器,但在设置DependencyResolver
后,您需要使用ContainerBuilder
注册更多内容。你不能这样做 - 你必须首先注册所有东西,然后建立容器作为你做的最后一件事。
这就是为什么它永远不会进入你的PersistenceModule
- 你已经建立了容器,所以它实际上没有注册。
如果由于某种原因,您需要将注册添加到已构建的容器中,则需要创建全新的ContainerBuilder
并调用builder.Update(container)
。但是,我强烈建议您重新排序,以便最后构建容器,而不是尽可能使用Update
路径。