public interface IDBEntity
{
//any code
}
public class Country : IDBEntity
{
//any code
}
public interface IDBEntityValidator<T> where T : IDBEntity
{
//any code
}
public class CountryValidator : IDBEntityValidator<Country>
{
//any code
}
хочется создать фабрику, создающую конкретный валидатор по типу сущности. примерно так:
public class DBEntityValidatorFactory
{
public static IDBEntityValidator<T> getValidator<T>(T entity) where T : IDBEntity
{
return ????
}
}
что здесь должно быть?
использовать хочется примерно так:
public abstract class Repository<T> where T : IDBEntity
{
//any code...public virtual void SaveOrUpdateEntity<K>(K entity) where K : T
{
session = Domain.CurrentSession;
ITransaction transaction = session.BeginTransaction();
try
{
IDBEntityValidator<K> validator = DBEntityValidatorFactory.getValidator(entity);
if(validator != null)
{
// необходимые проверки в валидаторе...
session.SaveOrUpdate(entity);
session.Flush();
transaction.Commit();
}
else
{
transaction.Rollback();
throw new Exception("Не удалось найти валидатор!");
}
}
catch (TransactionException exception)
{
transaction.Rollback();
throw new Exception(exception.Message);
}
finally
{
LockEntity(entity, true);
}
}
Здравствуйте, LF, Вы писали:
LF>Я для подобных целей использую dependency injection, в частности Unity
нельзя ли по-подробней? немного погуглив пришёл к выводу, что суть сводится примерно к следующему:
public static IDBEntityValidator<T> getValidator<T>(T entity) where T : IDBEntity
{
return new CountryValidator(); //в зависимости от типа сущности (пока не важно - свитчем делать или нет)
}
однако здесь будет ошибка приведения типов.
или я не прав?
M>нельзя ли по-подробней?
Суть в том, что у нас есть некий контейнер,
который по типу интерфейса вернет конкретный экземпляр.
В вашем случае фабрика вообще не нужна, а можно сделать так:
на этапе инициализации регистрируем типы:
Здравствуйте, mitrofanofff, Вы писали:
M>хочется создать фабрику, создающую конкретный валидатор по типу сущности. примерно так:
M> public class DBEntityValidatorFactory
M> {
M> public static IDBEntityValidator<T> getValidator<T>(T entity) where T : IDBEntity
M> {
M> return ????
M> }
M> }
M>что здесь должно быть?
Например, обращение к словарю, клчём в котором был бы тип T, а значением — метод, создающий валидатор, соответствующий ключу.
Другой вариант — добавить в IDBEntity метод "getValidator".
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, mitrofanofff, Вы писали:
M>>хочется создать фабрику, создающую конкретный валидатор по типу сущности. примерно так: _FR>
M>> public class DBEntityValidatorFactory
M>> {
M>> public static IDBEntityValidator<T> getValidator<T>(T entity) where T : IDBEntity
M>> {
M>> return ????
M>> }
M>> }
_FR>
M>>что здесь должно быть?
_FR>Например, обращение к словарю, клчём в котором был бы тип T, а значением — метод, создающий валидатор, соответствующий ключу. _FR>Другой вариант — добавить в IDBEntity метод "getValidator".
но тут, скорее, стоит вопрос о приведении типов. (IDBEntityValidator<T>)CountryValidator не работает...=(
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, mitrofanofff, Вы писали:
M>>но тут, скорее, стоит вопрос о приведении типов. (IDBEntityValidator<T>)CountryValidator не работает...=(
_FR>Если положить, что T — это Country, то нужно так:
_FR>