2009-04-24 3 views
0

코드를 수정하지 않고 SubSonic 생성기를 확장 할 수 있습니까? 템플릿 내에서 사용할 수있는 내 자신의 사용자 지정 메서드를 추가하고 싶습니다. 유틸리티 (Utility.GetVariableType) 메소드와 비슷합니다.SubSonic 생성기 확장

답변

1

나는 내 자신의 문제에 대한 해결책을 찾았습니다. :)
이제 SubSonic 코드 자체를 다시 작성하거나 변경할 필요없이 템플릿에서 필요한 기능으로 SubSonic을 확장 할 수 있습니다.
내가하고 싶었던 것을 위해 작동하고 난 그것뿐만 아니라 그것이 여기에, 그래서 다른 사람을 위해 유용 할 수 있다고 생각 :

  1. 새로운 클래스 라이브러리 SubSonicHelper을 만듭니다. 광산에는 다음과 같은 클래스가 있습니다.

    using System; 
    using System.Collections.Generic; 
    using System.Text; 
    
    namespace Helpers.SubSonic 
    { 
        public class GeneratorHelper 
        { 
         public bool IsColumnAllowed(string columnName) 
         { 
          return columnName.Length == 1 || 
            (columnName.Length > 1 && 
            (!(columnName[0].ToString().Equals("_") && 
            columnName[columnName.Length - 1].ToString().Equals("_")))) 
         } 
        } 
    } 
    
  2. SubSonicHelper.dll을 서브 소닉 프로젝트에 복사하십시오.
  3. templateDirectory 매개 변수를 사용하여 자신 만의 템플릿을 사용하도록 SubSonic 프로젝트를 설정하십시오.
  4. 편집 자신의 템플릿과에서 당신은 템플릿 내에서 사용할 수있는 GeneratorHelper의 인스턴스는이 후 const bool showGenerationInfo = false;

    System.Reflection.Assembly a = System.Reflection.Assembly.LoadFile(
        System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "SubSonicHelper.dll")); 
    object instance = a.CreateInstance("Helpers.SubSonic.GeneratorHelper"); 
    Type type = instance.GetType(); 
    

후 한 다음. 메서드에 액세스하려면 다음을 수행해야합니다.

  1. 사용할 메서드의 매개 변수에 대한 개체 배열을 만듭니다. col.propertyName으로 설정 한 columnName 매개 변수가 있습니다. 이것은 Update 메서드의 foreach (TableSchema.TableColumn col in cols) 루프 안에 있습니다.
  2. 개체 배열과 함께 사용하려는 메서드를 인수로 호출하십시오.
  3. 결과 개체를 검사하여 메서드 결과를 확인하십시오.그것 뿐이다

    object[] arg = new object[]{col.PropertyName}; 
    object isColumnAllowedResult = type.InvokeMember("IsColumnAllowed", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, instance, arg); 
    if (Convert.ToBoolean(isColumnAllowedResult)) 
    

! 이제 SubSonicHelper 클래스를 템플릿 내부에서 사용하려는 다른 메서드로 확장 할 수 있습니다.

0

템플릿에 dll을 가져올 수 있습니까?
<% @ 가져 오기 네임 스페이스와 같은
= "NewHelpers.Utilities"%>
다음 함수를 호출하거나

+0

GAC의 NewHelpers.Utilities 네임 스페이스가 포함 된 DLL이 있는데이 DLL을 프로젝트의 DAL을 만드는 데 필요한 참조에 추가했습니다. 가져 오기 줄을 템플릿에 추가했지만 static 메서드를 호출하자마자 SubSonic이 ERROR와 충돌합니다. generate를 실행하려고 시도합니다. 도우미 클래스와 메서드는 모두 정적이며 다른 프로젝트에서 호출하여 작업 할 수 있습니다. 나는 sonic.exe generate/out Generated를 사용하여 내 DAL을 생성한다고 말해야합니다. 아마도 그것이 문제일까요? – Marco

3

당신은 템플릿에 내장를 확장하지 수있는 개체의 인스턴스를 만들 수 있지만 은 SubSonic.dll을 변경하지 않고을 자신의 템플릿으로 바꾸실 수 있습니다. 여기에 templateDirectory 매개 변수를 참조하십시오 : http://subsonicproject.com/docs/Generated_Classes/#Customizing_Active_Record

example configuration은 다음과 같습니다

<SubSonicService defaultProvider="Northwind" enableTrace="true" 
    templateDirectory="C:\Program Files\SubSonic\SubSonic 2.0.3\Templates\MVC"> 
    <providers> 
     <clear/> 
     <add name="Northwind" type="SubSonic.SqlDataProvider, SubSonic" 
     connectionStringName="Northwind" generatedNamespace="Northwind"/> 
    </providers> 
    </SubSonicService> 

당신은 here에서 내장 된 액티브 템플릿의 현재 버전을 얻을 수 있습니다.