Добрый день.
Сейчас в BlToolkit'е при mapping'е вложенных классов сделано так, что если поле == null, тогда вложенный тип не мапится. А я хотел бы сделать чтобы он автоматически создавался как только в него пытаются что-то записать (чтобы вызывался конструктор по умолчанию).
Как можно это сделать? Что где подправить и что переопределить?
public class Obj1
{
public int f1;
public Obj2 f2;
}
public class Obj2
{
public int f1;
}
public class Program
{
static void Main(string[] args)
{
using (DbManager db = new DbManager())
{
db.SetCommand("SELECT 1 AS f1, 2 as [f2.f1]");
Obj1 obj1 = db.ExecuteObject<Obj1>();
Assert.True(obj1 != null);
Assert.True(obj1.f2.f1 == 2);
}
}
}
Здравствуйте, IvanKuzmich, Вы писали:
public class Obj1
{
public int f1;
public Obj2 f2 = new Obj2();
}
?
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, IvanKuzmich, Вы писали:
IT>IT>public class Obj1
IT>{
IT> public int f1;
IT> public Obj2 f2 = new Obj2();
IT>}
IT>
IT>?
Так не интересно. Получается, что каждый раз мы создаем объект класса Obj1 и автоматически создаем и вложенный Obj2. Хотелось бы инициализировать поле "при необходимости". Например, получение из базы данных. Сейчас маппер игнорирует поля, если значение null, а как можно сделать, чтобы маппер не игнорировал их, а пытался создать новый объект и замэпить уже туда поля из базы данных.
Здравствуйте, IT, Вы писали:
У нас сделано так: если поле объекта null — значит оно неизвестно и данные из базы не получены. Если не null — значит в поле уже загружены достоверные данные с заполненной структурой.
Поэтому хотелось бы сделать, чтобы конструктор вызывался автоматически.
IT>IT>public class Obj1
IT>{
IT> public int f1;
IT> public Obj2 f2 = new Obj2();
IT>}
IT>
IT>?
Здравствуйте, IvanKuzmich, Вы писали:
IK>У нас сделано так: если поле объекта null — значит оно неизвестно и данные из базы не получены. Если не null — значит в поле уже загружены достоверные данные с заполненной структурой.
IK>Поэтому хотелось бы сделать, чтобы конструктор вызывался автоматически.
public class Obj1
{
public Obj1()
{
}
public Obj1(InitContext ctx)
{
f2 = new Obj2();
}
public int f1;
public Obj2 f2;
}
?
... << RSDN@Home 1.2.0 alpha rev. 0>>
IK>>У нас сделано так: если поле объекта null — значит оно неизвестно и данные из базы не получены. Если не null — значит в поле уже загружены достоверные данные с заполненной структурой.
IK>>Поэтому хотелось бы сделать, чтобы конструктор вызывался автоматически.
IT>IT>public class Obj1
IT>{
IT> public Obj1()
IT> {
IT> }
IT> public Obj1(InitContext ctx)
IT> {
IT> f2 = new Obj2();
IT> }
IT> public int f1;
IT> public Obj2 f2;
IT>}
IT>
IT>?
Да, как вариант!
Но, дело в том что, у одного и того же объекта могут быть получены из базы разные вложенные объекты, в зависимости от вызванной хранимой процедуры. Т.е. один раз одно поле может инициализироваться, а другой раз другое.
Поэтому, придеться написать что-то вроде такого.
public Obj1(InitContext ctx)
{
for (int i = 0; i < ctx.DataSource.Count; i++)
{
if (ctx.DataSource.GetName(i).StartsWith("f2."))
{
f2 = new Obj2()
}
}
}
И что если у объекта двойная вложенность, т.е. например поле AS [f1.f2.f3]? В этом случае и объект Obj2 надо создавать через new Obj2(ctx), но InitContext уже нужен другой.
Может я заморачиваюсь и есть попроще какой вариант?
И, возможно, архитектурный подход выбран не верно, интересно было бы посмотреть на архитектуру готового решения с BLToolkit.