2009-08-19 5 views
2

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

Таким образом, чтобы поддерживать эту систему, я начал с интерфейсом:

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. К, От, и объект

Затем я создал свой класс Message

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) 
) 

идентификатор для обоих моих пользователи и организации являются направляющими. Теперь у меня есть четкое сопоставление для сообщений User-User. Моя мысль состоит в том, что мне нужно будет только создать 4 сопоставления и не поддерживать 4 отдельных класса для пользователей, пользователей, организаций, орг-пользователей и 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 association from the table PassedItems does not specify the referenced entity

Итак, будет ли этот подход даже работать? Что я делаю не так? Благодаря!

+0

Я попытался изменить ссылки, указав тип. К сожалению, это тоже не сработало: Ссылки (x => x.From, "FromId"); – Josh

+0

FYI - мы используем версию FluentNHibernate версии 0.1.0.363 и NHibernate версии 2.0.1.4000 – Josh

ответ

0

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

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

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

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

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

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

В моем переводе Fluent используется PassableItem.

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

0

И что такое отображение для «От» & «На что»?

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

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

Олли

+0

От и до в этом экземпляре находятся объекты UserProfile, которые отображаются и работают некоторое время. Я думаю, вы неправильно поняли. «Сообщение» в этом случае не является транспортным протоколом. Это реальная система обмена сообщениями, в которой пользователи получают сообщения в папке «Входящие», и в конечном итоге я хочу иметь возможность расширять систему, чтобы пользователи и организации могли отправлять больше, чем просто текст. – Josh