Дженерики с свободно и NHibernate - PullRequest
2 голосов
/ 20 августа 2009

Я пытаюсь создать систему обмена сообщениями между пользователями и организациями, то есть пользователь может отправлять и получать сообщения от пользователей или организаций.

Итак, для поддержки этой системы я начал с интерфейса:

public interface IPassableObject<F, T, O>
    where F : DomainObject 
    where T : DomainObject
{
    Guid PassedItemId { get; set; }
    O Item { get; set; }
    F From { get; set; }
    T To { get; set; }
    DateTime Created { get; set; }
}

Идея состоит в том, что позже я хотел бы иметь возможность передавать больше, чем просто сообщения - как сериализованные объекты. Итак, у нас есть класс с 3 типами Generic. Кому, От и объекту

Тогда я создал свой класс сообщений

public class Message<T, F> : DomainObject, IPassableObject<T, F, string>
    where F : DomainObject
    where T : DomainObject
{

    public Message()
    {
        Created = DateTime.Now;
    }

    #region IPassableObject<T,F> Members

    public virtual Guid PassedItemId { get; set; }

    public virtual string Item { get; set; }

    public virtual T From { get; set; }

    public virtual F To { get; set; }

    public virtual DateTime Created { get; set; }

    #endregion
}

Затем я сделал свой стол для поддержки пропущенных предметов:

CREATE TABLE dbo.PassedItems
(
    PassedItemId            uniqueidentifier        NOT NULL,
    FromId                  uniqueidentifier        NOT NULL,
    ToId                    uniqueidentifier        NOT NULL,
    SerializedObject        varchar(max)            NOT NULL,
    Created                 datetime                DEFAULT(GETEDATE()) NOT NULL,

    CONSTRAINT PK_PassedItems PRIMARY KEY CLUSTERED (PassedItemId)
)

Идентификаторы для моих пользователей и организаций являются направляющими. Теперь у меня есть свободное отображение для сообщений пользователя - пользователя. Я думаю, что мне нужно будет создать только 4 сопоставления, а не поддерживать 4 отдельных класса для user-user, user-org, org-user и org-org. Я надеялся, что Nhibernate возьмет указатель в таблицу и автоматически попытается добавить объект в соответствии с указанным типом.

public class UserToUserMessageMap : ClassMap<Message<UserProfile, UserProfile>>
{
    public UserToUserMessageMap()
    {
        WithTable("PassedItems");

        Id(x => x.PassedItemId, "PassedItemId").GeneratedBy.Guid();

        Map(x => x.Item, "SerializedObject");
        Map(x => x.Created);

        References(x => x.From, "FromId");
        References(x => x.To, "ToId");
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что при запуске приложения возникает ошибка во время выполнения:

NHibernate.MappingException: An ассоциация из таблицы PassedItems не указывает ссылочный объект

Так, этот подход вообще сработает? Что я делаю неправильно? Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 сентября 2009

Я нашел решение своей проблемы. Чтобы дать приблизительный обзор того, что я сделал:

Мне пришлось выбросить дженерики.

У меня есть интерфейс, IPassable.

У меня есть абстрактный класс, который реализует IPassable: PassableBase

У меня есть «фиктивный» класс PassableItem, унаследованный от PassableBase. Этот класс ничего не делает за пределами значений по умолчанию, установленных в PassableBase.

Сообщение - это класс, который также наследуется от PassableBase. Другие переданные объекты должны будут наследоваться от PassableBase.

Мое отображение Fluent использует PassableItem.

Мои репозитории используют PassableBase для входных параметров, и я создаю новый PassableItem или получаю PassableItem из хранилища (в зависимости от того, создан он уже или нет), а затем выполняю сохранение / удаление объекта PassableItem.

0 голосов
/ 20 августа 2009

Так как же выглядит отображение «От» и «Кому»?

Потому что я думаю, что NH не умеет сопоставлять эти объекты, потому что вы не предоставили информацию о сопоставлении.

В целом для меня это звучит так, как будто вы заново изобретаете колесо, рассматривали ли вы технологические стеки, такие как веб-службы (SOAP & REST), очереди сообщений, удаленное взаимодействие (.Net). И конкретные реализации, такие как WCF, ASMX (веб-сервисы), nServiceBus, MassTransit, MSMQ и многие другие ...

Олли

...