+我创建了UnitOfWork,实体框架DbContext
初始化为private DbContext context = new DbContext();
所有工作都很好,直到我想更新数据库中的字段。更改将反映在数据库中,但 DbContext 不会反映更改。但是,向数据库添加新记录的更改反映在DbContext中,但不是修改。我必须重新启动应用程序才能看到更改。因此,类似于修改后不会丢弃DbContext。
所以我决定使用 Autofac 来创建单个数据库实例。这是我的背景:
public class DatabaseContext : IdentityDbContext<ApplicationUser>
{
static DatabaseContext()
{
Database.SetInitializer(new MySqlInitializer());
}
public DatabaseContext() : base("apiConnection") { }
public DbSet<PaperEntity> PastPapers { get; set; }
}
我注册了这样的上下文,
var builder = new ContainerBuilder();
builder.RegisterType<DatabaseContext>().AsSelf().SingleInstance();
//builder.RegisterType<UnitOfWork>().SingleInstance();
builder.RegisterApiControllers(typeof(AccountController).Assembly);
//builder.RegisterType<ISecureDataFormat<AuthenticationTicket>>().As<TicketDataFormat>();
//builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<SimpleAuthorizationServerProvider>()
.AsImplementedInterfaces<IOAuthAuthorizationServerProvider, ConcreteReflectionActivatorData>().SingleInstance();
container = builder.Build();
app.UseAutofacMiddleware(container);
var webApiDependencyResolver = new AutofacWebApiDependencyResolver(container);
var configuration = new HttpConfiguration
{
DependencyResolver = webApiDependencyResolver
};
ConfigureOAuth(app, container);
WebApiConfig.Register(configuration);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(configuration);
app.UseAutofacWebApi(configuration);
我有一个看起来像这样的AccountController
[RoutePrefix("api/Account")]
public class AccountController : ApiController
{
private readonly AccountService accountService;
public AccountController()
{
accountService = new AccountService();
}
private IAuthenticationManager Authentication
{
get { return Request.GetOwinContext().Authentication; }
}
[AllowAnonymous]
[HttpPost]
[Route("Register")]
public async Task<IHttpActionResult> Register([FromBody]RegisterBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
IdentityResult result = await accountService.RegisterUser(model, this);
return Ok(result);
}
帐户控制器有一个
private readonly AccountService accountService;
public AccountController()
{
accountService = new AccountService();
}
具有工作单元实例的实例,如此...
private UnitOfWork unitOfWork;
public AccountService()
{
unitOfWork = new UnitOfWork();
}
现在,我确定我已经配置了Autofac,因为授权适用于此,
AuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
Provider = container.Resolve<IOAuthAuthorizationServerProvider>(),
//AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
};
请注意Provider = container.Resolve<IOAuthAuthorizationServerProvider>()
部分。但是当我尝试从UnitOfWork中的容器中获取DatabaseContext实例时,
像这样,
private static IContainer Container { get; set; }
private DatabaseContext context = Container.BeginLifetimeScope().Resolve<DatabaseContext>();
一切都停止工作,出现以下错误
“消息”:“发生错误。”,“ExceptionMessage”:“错误 尝试创建类型的控制器时发生 '的AccountController'。确保控制器具有无参数 public constructor。“,”ExceptionType“: “System.InvalidOperationException”,“StackTrace”:“at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor,Type controllerType)\ r \ n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage 请求)\ r \ n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()
我希望获得帮助以获取已注册的DatabaseContext而无需为上下文创建接口,或者如何创建没有接口的UnitOfWork实例,或者两者兼而有之,我不想要的只是DatabaseContext,UnitOfWork或Services中的额外接口,但最好是,如果一个界面是不可避免的,UnitOfWork将是拥有它的最佳地点......