2016-07-29 5 views
2

У меня есть следующие на запуск приложения ASP.NET Core:Получение «Не удается получить доступ к объекту», расположенную при использовании FV и EF в ASP.NET Ядра

services.AddDbContext<Context>(x => x.UseSqlServer(connectionString)); 

services.AddFluentValidation(x => x.RegisterValidatorsFromAssemblyContaining<Startup>()); 

Когда я впрыснуть Entity Framework контекст на FluentValidation валидатор:

public class TestModelValidator : AbstractValidator<TestModel> { 
    public TestModelValidator(Context context) { 
    } 
} 

Я получаю следующее сообщение об ошибке:

ObjectDisposedException: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur is you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances. 
Object name: Context 

Что я упускаю?

+0

Регистрирует ли регистр 'AddFluentValidation' как singleton? Вы не можете вводить DbContext в одиночные игры, потому что по умолчанию настройки - это то, что 'DbContext' зарегистрирован как служба с ограниченным доступом и получает доступ после каждого запроса (во избежание утечек памяти с помощью DbContext, отслеживающего состояния). – Tseng

+0

Да, плавная проверка добавляется как одиночные. Но я также попытался ввести Func , и я получаю ту же ошибку. Нужно ли мне? –

+0

Как вы зарегистрировали 'Func '? Метод фабрики должен работать на самом деле, если зарегистрирован правильно – Tseng

ответ

1

Как упоминалось в комментариях, валидаторы, созданные по умолчанию как одиночные, и я настоятельно рекомендую вам не менять срок действия валидаторов из-за соображений производительности - они очень дороги для создания экземпляра.

Я предпочитаю легкий экземпляр объекта контекста по требованию внутри PredicateValidator (ака Must) выражение тела - это подход решения проблемы пожизненного неравенства.

Пример с ServiceLocator рисунком:

public class MyValidator: AbstractValidator 
{ 
    public MyValidator() 
    { 
     RuleFor(x => x.Email).Must(email => IsUnique(email)).WithMessage("email must be unique"); 
    } 

    private IsUnique(string email) 
    { 
     var context = !ServiceLocator.Instance.Resolve<Context>(); 
     return context.Users.Any(x => x.Email == email); 
    } 
} 

Эта тема может быть полезно для implementation of service locator with AutoFac.