IronPython for ASP.NET 的屬性注入器機制可以讓一些程式碼的語法變得簡單(詳細了解參考我的這篇文章),但是預設的支援似乎現在還很不完整。
我反編譯了Microsoft.Web.IronPython.dll,在其中增加了對RepeaterItem 和Session (HttpSessionState) 的屬性注入支援。
對RepeaterItem 的支援很簡單,因為本身已經有了ControlAttributesInjector. 所以只要在DynamicLanguageHttpModule.cs 的靜態建構器中加一行程式碼即可:
// repeater item
Ops.RegisterAttributesInjectorForType(typeof(RepeaterItem), new ControlAttributesInjector(), false);
而Session 則不那麼幸運,這個類別實作了ICollection,但是確沒有實作IDictionary 介面。所以就無法利用DictionaryAttributesInjector. 沒辦法,我自己給加了個SessionAttributesInjector 類別。程式碼如下:
using IronPython.Runtime;
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Web.SessionState;
using System.Diagnostics;
namespace Microsoft.Web.IronPython.AttributesInjectors {
// added by Neil Chen.
internal class SessionAttributesInjector: IAttributesInjector {
List IAttributesInjector.GetAttrNames(object obj) {
HttpSessionState session = obj as HttpSessionState;
List list = new List();
foreach (string key in session.Keys) {
list.Add(key);
}
return list;
}
bool IAttributesInjector.TryGetAttr(object obj, SymbolId nameSymbol, out object value) {
HttpSessionState session = obj as HttpSessionState;
value = session[nameSymbol.GetString()];
return true;
}
}
}
附上我修改過的Microsoft.Web.IronPython.dll
要說明的是,屬性注入器只對get 操作有用,例如
name = Session.Name 是可以的,
但是設定則不行:
Session.Name = 'some name' 會報錯。
還是需要用這個語法:
Session["Name"] = 'some name'