在我们的应用程序数据层中,我们完全依赖存储过程和Web服务进行数据交换。我们在页面加载中使用如下代码来执行存储过程
switch(requesttype)
{
case "GetEmployees":
switch (crud_type)
{
case "read":
Execute Stored Procedure 'A'
break;
}
break;
}
我们正在寻找将上述代码(在类文件中)删除到某种形式的配置文件
的方法我们正在寻找能够快速检索(读取,解析等)和保存(写入,修改等)的文件存储格式
我们可以在它上面实现一个安全层
无需大惊小怪就可以实现这一目标,并对现有代码进行重大更改。
答案 0 :(得分:1)
我想我已经超越了自己。你无法用配置代替代码,因为代码将做某事,而配置只会告诉代码什么或怎么做(除非配置本身包含代码,在这种情况下你有一个代码)悖论)。如果您想对代码应用可配置性,首先需要使其更通用/通用(您的switch
语句表明它现在不一般)。我在原始答案(下面)中描述了我这样做的方法。它本身不提供可配置性,但可以这样做(我已经相当简单地完成了)。该代码基于您的原始问题,因此请重新调整您的眼睛以正确阅读。
我过去选择的选项是使用工厂(无论是安装在Singleton中还是以IoC容器的形式传递给拥有代码示例的函数。
我的方法的高级实现基本上是定义一个自定义属性,该属性包含一个属性,指示何时类型有用。类似的东西:
public class DbOperationAttribute : Attribute
{
public string Operation { get; set; }
}
一个通用接口,用于提供运行代码所需的API。类似的东西:
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
来存储您的配置。无论如何它通常会在那里;也可以将它用于您的目的。