2009-05-06 7 views
0

私はクラス生成(テーブル用のクラス - 継承などは現在考えられていない...)で遊んでいます。そこで私はhereから恥知らずにReflection.Emitコードをコピーしました。指定されたデータベースのテーブルごとに生成されるように再作成し、プロジェクトのbinフォルダに/ f "tokens = *" %% iの場合は のファイルを作成しました。do( 'dir * .xsd/b')do "C:¥Program Files¥Microsoft SDKs¥Windows¥v6.0A¥bin¥xsd.exe" -c -l:c#-n:BusinessObjects%iReflection.Emitとxsdファイルを使用してデータベーステーブルからクラスを生成する際に予想される落とし穴を教えてください。

これまでのところとても良いです。このアイデアは、クラスを再生成して "実際のプロジェクト"(私はランタイム生成を必要としません)でそれらをコピーし、Intellisenseを楽しんでみたいです。どのような落とし穴、困難や問題がこのタイプのアプローチから生まれるかもしれません。あなたは(リレーショナル)を使用して、すべての問題を取得

using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using log4net; 
    using log4net.Config; 
    using System.Data; 
    using System.Data.SqlClient; 
    using System.Threading; 
    using System.Reflection; 
    using System.Reflection.Emit; 

    namespace GenerateAssemblies 
    { 

     class Program 
     { 

     private static readonly ILog logger = 
      LogManager.GetLogger (typeof (Program)); 


     static void Main (string[] args) 
     { 
      DOMConfigurator.Configure(); //tis configures the logger 
      logger.Debug ("APP START"); 

      DataTable dtTables = Program.GetTablesFromDb ("POC") ; 
      foreach (DataRow dr in dtTables.Rows) 
      { 
      string strTableName = dr[0].ToString() ; 
      CodeEmitGeneratingAssemblies.DllGenerator.WriteXmlAndTxtFileOutOfDataTableByName ( strTableName); 
      CodeEmitGeneratingAssemblies.DllGenerator.CreateAssembly (strTableName); 
      } 


      Console.WriteLine (" Should have now all the dll's "); 
      Console.ReadLine(); 
     } //eof method 



     static DataTable GetTablesFromDb (string strDbName) 
     { 


      DataTable dt = new DataTable ("tables"); 

      string connectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=" + strDbName + ";Data Source=ysg"; 

      using (SqlConnection connection = new SqlConnection (connectionString)) 
      { 
      SqlCommand command = connection.CreateCommand(); 

      command.CommandText = string.Format ("SELECT name from sys.tables"); 

      connection.Open(); 
      dt.Load (command.ExecuteReader (CommandBehavior.CloseConnection)); 
      } 
      return dt; 
     } //eof method 


     } //eof class 


    namespace CodeEmitGeneratingAssemblies 
    { 
     public class DllGenerator 
     { 
     private static readonly ILog logger = 
      LogManager.GetLogger (typeof (DllGenerator)); 




     public static void WriteXmlAndTxtFileOutOfDataTableByName (string strDataTableName) 
     { 
      DOMConfigurator.Configure(); //tis configures the logger 
      DataTable tableData = new DataTable (strDataTableName); 

      string connectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=POC;Data Source=ysg"; 

      using (SqlConnection connection = new SqlConnection (connectionString)) 
      { 
      SqlCommand command = connection.CreateCommand(); 

      command.CommandText = string.Format ("SELECT * FROM [" + strDataTableName + "]"); 
      logger.Debug ("command.CommandText is " + command.CommandText); 
      connection.Open(); 
      tableData.Load (command.ExecuteReader (CommandBehavior.CloseConnection)); 
      } 

      tableData.WriteXml (strDataTableName + ".xml"); 
      tableData.WriteXmlSchema (strDataTableName + ".xsd"); 
     } //eof method 


     public static void CreateAssembly (string strDataTableName) 
     { 
      AppDomain currentDomain = Thread.GetDomain(); 

      AssemblyName myAssemblyName = new AssemblyName (); 
      myAssemblyName.Name = strDataTableName; 

      AssemblyBuilder builder = currentDomain.DefineDynamicAssembly (
           myAssemblyName, 
           AssemblyBuilderAccess.RunAndSave); 

      builder.AddResourceFile ("TableXml", strDataTableName + ".xml"); 
      builder.AddResourceFile ("TableXsd", strDataTableName + ".xsd"); 

      builder.Save (strDataTableName + ".dll"); 
     } 

     } //eof class 
    } //eof namespace 

    } //eof namespace 

答えて

1

データベース駆動型オブジェクト指向設計:

  • 十分ではない抽象ここ

    は、コンソールアプリケーション作成の生成コードのアセンブリであります継承はなく、ADTの構築もない。
  • クラスが多すぎるクラス。
  • 間違った場所での動作。
  • 時間の側面を処理するのに使用可能な方法はありません。

私は別の方法で作業することを好む。 ooモデルからデータベースへ

[編集] あなたはハイブリッドモデルを稼働させることができます。アプリの一部ではDBからOOに、別の部分については逆に進む。これにより、徐々にリファクタリングし、OO - > DBに移行することができます。亜音速で

+0

...私の問題は、実際にDBはすでにので、私はそれを採用しなければならない存在ということです私はあなたに同意。.. –

0

当たり前... oneliner:

sonic generate /override /server HOMIE /db BlogEngine /userid OMMITED /password OMMITED /out C:\code\out /generatedNamespace BlogEngine.Core.Providers.SubSonic /stripTableText be_ 
関連する問題