我覺得我超前了。你不能用配置來替換代碼,因爲代碼會做做的事情,而配置只是告訴代碼什麼或怎麼做(除非配置本身包含代碼,在這種情況下你有一個悖論)。如果你想對你的代碼應用可配置性,你首先需要使它更通用/通用(你的switch
聲明表明它現在是而不是一般)。我的原始答案描述了我的做法(下文)。它本身並不提供可配置性,但可以做到這一點(我相當簡單)。該代碼是基於你原來的問題,所以請重新調整你的眼睛正確閱讀。
我已經在過去選擇了選項是使用一個工廠(無論是一棟單身或傳遞給函數在IoC容器的形式擁有您的代碼示例。
我的方法的非常高的水平實現基本定義包含指示你的類型時非常有用的東西像一個屬性自定義屬性:
public class DbOperationAttribute : Attribute
{
public string Operation { get; set; }
}
的通用接口,提供API NE讓你的代碼運行。喜歡的東西:
public interface IDoSomethingSpecial
{
bool Execute(SomeExecutionContext context);
}
然後你裝飾特定的類與屬性,並實現該接口,以表明它們適合於每一個動作:
[DbOperation(Operation = "Read")]
public class DBReadOperation : IDoSomethingUseful
{
// Our implementation of the `IDoSomethingUseful` interface
public bool Execute(SomeExecutionContext context)
{
// Do something useful in here
}
}
在你的程序有些時候你會需要能夠發現哪些類型適合哪些操作。我用反射來做這件事,儘管它可以很容易地通過配置來完成(這會破壞屬性點)。幾個IoC容器提供了類似的可發現性屬性,儘管使用其他人的方式(通常情況下)您將繼續按照自己的方式進行操作。
一旦你發現了哪些類型適合哪些操作,您可以使用類似:
IDoSomethingUseful someAction = myCollectionOfUsefulThings(requesttype);
someAction.Execute(someInstanceOfOurContextType);
在此基礎上設計我的偏向只是用App.Config
/Web.Config
存儲配置。無論如何,它通常會在那裏;不妨將它用於你的目的。
問題需要措辭有點不同,它有點難以分辨你正在尋找什麼 – 2012-02-14 05:56:20
@DanielPowell它現在是否符合SO問題格式? – Deeptechtons 2012-02-14 06:01:37
有三列的Sqlite表會做這項工作嗎? (RequestType,CrudType,StoredProcedureName) – 2012-02-14 06:19:43