Автоматическое создание вложенных объектов
От: IvanKuzmich  
Дата: 20.06.06 14:40
Оценка:
Добрый день.

Сейчас в 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);
        }
    }
}
Re: Автоматическое создание вложенных объектов
От: IT Россия linq2db.com
Дата: 20.06.06 16:47
Оценка:
Здравствуйте, IvanKuzmich, Вы писали:

public class Obj1
{
    public int f1;
    public Obj2 f2 = new Obj2();
}

?
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Автоматическое создание вложенных объектов
От: IvanTretyakov  
Дата: 20.06.06 19:21
Оценка:
Здравствуйте, 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, а как можно сделать, чтобы маппер не игнорировал их, а пытался создать новый объект и замэпить уже туда поля из базы данных.
Re[2]: Автоматическое создание вложенных объектов
От: IvanKuzmich  
Дата: 21.06.06 03:47
Оценка:
Здравствуйте, IT, Вы писали:

У нас сделано так: если поле объекта null — значит оно неизвестно и данные из базы не получены. Если не null — значит в поле уже загружены достоверные данные с заполненной структурой.

Поэтому хотелось бы сделать, чтобы конструктор вызывался автоматически.

IT>
IT>public class Obj1
IT>{
IT>    public int f1;
IT>    public Obj2 f2 = new Obj2();
IT>}
IT>

IT>?
Re[3]: Автоматическое создание вложенных объектов
От: IT Россия linq2db.com
Дата: 21.06.06 03:58
Оценка:
Здравствуйте, 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>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Автоматическое создание вложенных объектов
От: IvanKuzmich  
Дата: 21.06.06 04:55
Оценка:
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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.