Я очень новичок в NHibernate и следую различным учебным пособиям онлайн, особенно этому , чтобы создать свою собственную программу. Мне очень понравилось использование перехватчика для добавления INotifyPropertyChanged
к сущностям, созданным с помощью DataBindingFactory
, и я пытался следовать той же идее, чтобы добавить IDataErrorInfo
к сущностям, созданным с помощью DataBindingFactory
, с помощью другого метода CreateWithValidation(Type type)
:
public static object CreateWithValidation(Type type)
{
return _proxyGenerator.CreateClassProxy(type, new[]
{
typeof (IDataErrorInfo),
typeof (INotifyPropertyChanged)
}, new IInterceptor[]
{
new NotifyPropertyChangedInterceptor(type.FullName),
new DataErrorInfoInterceptor()
});
}
Код для NotifyPropertyChangedInterceptor
такой же, как в связанной статье, и ниже моя реализация класса DataErrorInfoInterceptor
, пришедшего из этой статьи :
public class DataErrorInfoInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
if (invocation.Method.DeclaringType.Equals(typeof(IDataErrorInfo)))
{
var validator = new ValidatorEngine();
var errors = validator.Validate(invocation.Proxy);
if (invocation.Method.Name.Equals("get_Item"))
{
String propertyName = Convert.ToString(invocation.Arguments[0]);
var propertyErrors = errors
.Where(e => e.PropertyName.Equals(propertyName))
.Select(e => e.Message)
.ToArray();
if (propertyErrors.Count() > 0)
{
invocation.ReturnValue = string.Join(Environment.NewLine, propertyErrors);
}
else
{
invocation.ReturnValue = null;
}
}
else if (invocation.Method.Name.Equals("get_Error"))
{
var allErrors = errors
.Select(e => e.Message)
.ToArray();
if (allErrors.Count() > 0)
{
invocation.ReturnValue = string.Join(Environment.NewLine, allErrors);
}
else
{
invocation.ReturnValue = null;
}
}
else
{
invocation.Proceed();
}
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что если я создаю объект с использованием метода CreateWithValidation()
и использую его на модели, любой текст, который я ввожу в текстовое поле в представлении, очищается, когда я убираю вкладку из поля (возможно бывает и в других областях, но я пробовал это только на текстовых полях). Я подозреваю, что это связано с тем, что оба класса, реализующие IInterceptor
, имеют строку invocation.Proceed()
, если перехваченный метод не тот, который интересует класс.
У меня вопрос: возможно ли иметь два перехватчика, подобных этому, или мне нужен один массивный класс, например: CustomInterceptor
, который имеет все методы, например: INotifyPropertyChanged
и IDataErrorInfo
и с ними там? Это кажется мне довольно громоздким.
Для чего это стоит, вот как я установил перехватчик на моем SessionFactory
:
public static void Initialise()
{
Configuration config = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c
.Server("")
.Database("")
.Username("")
.Password("")))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Map>()
.Conventions.AddFromAssemblyOf<EnumConvention>())
.BuildConfiguration();
ConfigureNhibernateValidator(config);
DataBindingInterceptor interceptor = new DataBindingInterceptor();
SessionFactory = config
.SetInterceptor(interceptor)
.BuildSessionFactory();
}