KitchenPC and Ironpython

本文关键字:Ironpython and KitchenPC | 更新日期: 2023-09-27 18:36:23

我正在尝试使用IronPython与KitchenPC一起工作。

我在这里使用数据库配置示例:http://blog.kitchenpc.com/2014/02/11/kitchenpc-database-provisioning-101/

我已成功引用和导入所有dll及其命名空间:

import clr
clr.AddReference("System")
from System import *
from System.Reflection import *
from System.Reflection import Assembly
L4N = Assembly.LoadFrom('C://KitchenPC//DLL//log4net.dll')  
clr.AddReference(L4N)
NU= Assembly.LoadFrom('C://KitchenPC//DLL//nunit.framework.dll')  
clr.AddReference(NU)
LC= Assembly.LoadFrom('C://KitchenPC//DLL//Iesi.Collections.dll')  
clr.AddReference(LC)
PGSQL = Assembly.LoadFrom('C://KitchenPC//DLL//Npgsql.dll')  
clr.AddReference(PGSQL)
NH = Assembly.LoadFrom('C://KitchenPC//DLL//NHibernate.dll') 
clr.AddReference(NH)
FNH = Assembly.LoadFrom('C://KitchenPC//DLL//FluentNHibernate.dll')  
clr.AddReference(FNH)
KPC = Assembly.LoadFrom('C://KitchenPC//DLL//KitchenPC.dll')  
clr.AddReference(KPC)
KPCDB = Assembly.LoadFrom('C://KitchenPC//DLL//KitchenPC.DB.dll')  
clr.AddReference(KPCDB)
clr.AddReferenceToFileAndPath('C://KitchenPC//DLL//FluentNHibernate.dll')
from Npgsql import *
from log4net import *
from Iesi.Collections import *
from FluentNHibernate import *
from FluentNHibernate.Cfg import *
from FluentNHibernate.Cfg.Db import *
from NHibernate import *
from NHibernate.Cfg import Configuration
from KitchenPC import *
from KitchenPC.DB import *
from KitchenPC.Context import DBContext
from KitchenPC.DB import DatabaseAdapter
from NUnit.Framework import *

我可以像这样定义一个PostgreSQLConfiguration

connString = "Server=localhost;Port=5432;User Id=postgres;Password=password;Database=KPCSample"
# Context connected to local database
DBC = PostgreSQLConfiguration.PostgreSQL82.ConnectionString(connString).ShowSql()

但是当我尝试设置数据库适配器时:

DatabaseAdapter.Configure.DatabaseConfiguration( DBC )

我遇到错误:

TypeError: expected IPersistenceConfigurer, got PostgreSQLConfiguration

奇怪的是,实例(DBCIPersistenceConfigurer)返回True,所以DBC确实是抽象类IPersistenceConfigurer的实例,抽象类是DatabaseAdapter的子类。

以下是我尝试从 C# 转置的原始代码的示例:

// Context connected to local database
var dbConfig = Configuration.Build
   .Context(DBContext.Configure
      .Adapter(DatabaseAdapter.Configure
         .DatabaseConfiguration(
            PostgreSQLConfiguration.PostgreSQL82
               .ConnectionString(@"Server=localhost;Port=5432;User Id=Website;Password=password;Database=KPCSample")
               .ShowSql()
         )
      )
   ).Create();
// Context connected to local data store
var staticConfig = Configuration.Build
   .Context(StaticContext.Configure
      .DataDirectory(@"C:'KitchenPC'ConsoleTest'LocalStore'")
   )
   .Create();

以下是KitchenPC的DatabaseAdapter类示例:

/// <summary>A database adapter that uses NHibernate to connect to an underlying database.</summary>
public class DatabaseAdapter : IDBAdapter, IDisposable
{
  ISessionFactory sessionFactory;
  Configuration nhConfig;
  readonly DatabaseAdapterBuilder builder;
  public IPersistenceConfigurer DatabaseConfiguration { get; set; }
  public List<IConvention> DatabaseConventions { get; set; }
  public ISearchProvider SearchProvider { get; set; }
  public static DatabaseAdapterBuilder Configure
  {
     get
     {
        return new DatabaseAdapter().builder;
     }
  }
  DatabaseAdapter()
  {
     builder = new DatabaseAdapterBuilder(this);
  }
}

我在 Ironpython 中实例化DatabaseAdapter做错了什么?

KitchenPC and Ironpython

事实证明,我导入的方式是不正确的。

但基本上,导入应该是这样的:

import clr
import sys
sys.path.append(os.path.abspath('./DLL')) #where your dlls are
clr.AddReference('System')
clr.AddReference('FluentNHibernate')
from FluentNHibernate.Cfg.Db import PostgreSQLConfiguration

如果另一个 DLL 在 clr 中导入该 DLL,则无需导入该 DLL。