NCommon Новичок Помощь - PullRequest
       17

NCommon Новичок Помощь

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

Я пишу это консольное приложение, чтобы попробовать NCommon.

Код ниже не возвращает мне ничего. (Это использует AdventureWorks db.)

class Program
{
    static void Main(string[] args)
    {
        ISessionFactory factory = SessionProvider.CreateSessionFactory();

        Store.Application.Set("NHibernateSessionFactory", factory);
        NHUnitOfWorkFactory.SetSessionProvider(GetSession);
        ConfigureContainer();

        using (ISession session = factory.OpenSession())
        {
            IRepository<SalesOrderHeader> orderRepository = new NHRepository<SalesOrderHeader>(session);

            using (var scope = new UnitOfWorkScope())
            {
                List<SalesOrderHeader> orders = new List<SalesOrderHeader>();
                orders = (from order in orderRepository
                          select order).ToList();

                foreach (var order in orders)
                {
                    Console.WriteLine(order.DueDate);
                }
            }
        }

        Console.WriteLine("[Done]");
        Console.ReadLine();
    }

    /// <summary>
    /// Configure the Windsor container.
    /// </summary>
    private static void ConfigureContainer()
    {
        var container = new WindsorContainer();
        var currentAssembly = typeof(Program).Assembly;

        //Register the NHibernate unit of work and repository components
        container.Register(Component.For<IUnitOfWorkFactory>().ImplementedBy<NHUnitOfWorkFactory>().LifeStyle.Transient)
                 .Register(Component.For(typeof(IRepository<>)).ImplementedBy(typeof(NHRepository<>)).LifeStyle.Transient);

        //Auto register all service implementations
        container.Register(AllTypes.FromAssembly(currentAssembly)
                                   .Where(type => type.Namespace.EndsWith("Services"))
                                   .WithService.FirstInterface()
                                   .Configure(x => x.LifeStyle.Transient));

        Store.Application.Set("ApplicationContainer", container);
        ServiceLocator.SetLocatorProvider
        (
            () => new WindsorServiceLocator(Store.Application.Get<IWindsorContainer>("ApplicationContainer"))
        );
    }

    private static ISession GetSession()
    {
        return Store.Application.Get<ISessionFactory>("NHibernateSessionFactory").OpenSession();
    }
}

public class SessionProvider
{
    public static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                .ConnectionString(@"Data Source=MYLAPTOP\SQL2008;Initial Catalog=AdventureWorks;Integrated Security=True;"))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SalesOrderHeader>())
            .BuildSessionFactory();
    }
}

public class ISalesOrderHeaderMap : ClassMap<ISalesOrderHeader>
{
    public ISalesOrderHeaderMap()
    {
        Table("Sales.SalesOrderHeader");
        Id(x => x.Id);
        References(x => x.Customer);
        Map(x => x.OrderDate);
        Map(x => x.DueDate);
        Map(x => x.ShipDate);
        Map(x => x.Status);
        HasMany(x => x.Details)
            .Inverse()
            .Cascade.All();
    }
}

[исключая код для POCO SalesOrderHeader и ISalesOrderHeader]

Я больше не добавлял настройки свойства Proxy Factory, как при попытке добавить

            .ExposeConfiguration(cfg =>
                {
                    cfg.Properties.Add("proxyfactory.factory_class",
                              "NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle");
                })

в заявлении SessionProvider «Свободно» говорится, что элемент с тем же ключом уже добавлен.

1 Ответ

2 голосов
/ 19 сентября 2009

Я понял, что Fluent NHibernate не очень хорошо работает с интерфейсами. Я сопоставил конкретные типы, и это сработало.

...