1
初期データ。コードファースト、AutofacEF。オートファック。常時エラーが発生しましたDBContextが破棄されました
Linq2Sql以前は、データレイヤー全体がメインプロジェクトに含まれていました。 EF CodeFirstですべてを書き直しました。 は今、私はエラーを取得しておいてください。DBContextは
が配置されているクラスがあります:
public class DataManager: IDataManager
{
private IModelDataContextWrapper _dataContext;
public IAuditRepository Audits { get; set; }
public ICDMRepository CDMs { get; set; }
public ICommandRepository Commands { get; set; }
public IMonitoringRepository Monitorings { get; set; }
public IRoleRepository Roles { get; set; }
public ISettingRepository Settings { get; set; }
public IUserRepository Users { get; set; }
public DataManager(IModelDataContextWrapper dataContext)
{
_dataContext = dataContext;
}
public IModelDataContextWrapper DataContext
{
get
{
return _dataContext;
}
}
public void Dispose()
{
if (_dataContext != null)
{
_dataContext.Dispose();
_dataContext = null;
}
GC.SuppressFinalize(this);
}
public void SaveChanges()
{
try
{
DataContext.SaveChanges();
}
catch (Exception ex)
{
string err = string.Format("exception: {0} stacktrace: {1}", ex.Message, ex.StackTrace);
Logger.Instance.WriteLine(err);
}
}
}
public class UserRepository : IUserRepository
{
private readonly IModelDataContext _context;
public UserRepository(IModelDataContext context)
{
_context = context;
}
}
Autofac登録:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<ModelDataContext>().As<IModelDataContext>().InstancePerLifetimeScope();
builder.RegisterType<ModelDataContextWrapper>().As<IModelDataContextWrapper>().InstancePerLifetimeScope();
builder.RegisterType<ArchiveModelDataContext>().As<IArchiveModelDataContext>().InstancePerLifetimeScope();
builder.RegisterType<DataManager>().As<IDataManager>().PropertiesAutowired().InstancePerLifetimeScope();
builder.RegisterType<AuditRepository>().As<IAuditRepository>().InstancePerLifetimeScope();
builder.RegisterType<CommandRepository>().As<ICommandRepository>().InstancePerLifetimeScope();
builder.RegisterType<CDMRepository>().As<ICDMRepository>().InstancePerLifetimeScope();
builder.RegisterType<MonitoringRepository>().As<IMonitoringRepository>().InstancePerLifetimeScope();
builder.RegisterType<RoleRepository>().As<IRoleRepository>().InstancePerLifetimeScope();
builder.RegisterType<SettingRepository>().As<ISettingRepository>().InstancePerLifetimeScope();
builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
builder.RegisterType<ThemedViewEngine>();
builder.RegisterFilterProvider();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
var lifetimeScope = DependencyResolver.Current.GetService<ILifetimeScope>();
lifetimeScope.InjectProperties(Membership.Provider);
lifetimeScope.InjectProperties(Roles.Provider);
間違っている何が?
を最初に、それはそうだったが、それはしません()。InstancePerHttpRequest(); ()。 –
InstancePerRequestでInstancePerHttp Requestではなく、静的リソースのインスタンスを避けるため、DbContextではなく、[GitHub](https://github.com/Nono31/Pixel)の使用例を見ることができます。サンプル) – Arnaud
InstancePerRequestはメソッドのリストにあります。 InstancePerLifetimeScopeのみ。プロジェクトはMVC 4です。 –