Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计问题:不同情境下的行为_C#_Sql_Design Patterns - Fatal编程技术网

C# 设计问题:不同情境下的行为

C# 设计问题:不同情境下的行为,c#,sql,design-patterns,C#,Sql,Design Patterns,我有一个普遍的问题:当一个对象的行为应该根据上下文而改变时,应该怎么做?请注意,这是关于SQL而不是C的,但我确实可以在这里使用一些想法 例如,Search类,我们称之为SearchObject。这个SearchObject从Google获取一个搜索词并返回5个结果。它只做这个和这个。 现在我有一个新的要求:如果对象是从某个上下文调用的,它会附加来自另一个搜索引擎的结果。例如,如果我从一个网页调用搜索,这个对象应该带来10个结果:前5个来自谷歌,最后5个来自Bing。如果它是从控制台应用程序调用

我有一个普遍的问题:当一个对象的行为应该根据上下文而改变时,应该怎么做?请注意,这是关于SQL而不是C的,但我确实可以在这里使用一些想法

例如,Search类,我们称之为SearchObject。这个SearchObject从Google获取一个搜索词并返回5个结果。它只做这个和这个。 现在我有一个新的要求:如果对象是从某个上下文调用的,它会附加来自另一个搜索引擎的结果。例如,如果我从一个网页调用搜索,这个对象应该带来10个结果:前5个来自谷歌,最后5个来自Bing。如果它是从控制台应用程序调用的,它应该会带来AltaVista的最后5个结果

如何根据OOP原则保持此对象的行为并获得所需的结果? 实现将在SQL中,所以我不能使用我在C中知道的设计模式


谢谢

如果我是用C写这篇文章的,我会做一些事情,让上下文对象提供给SearchObject并生成必要的参数

为了在SQL中实现类似的想法,您需要一个包含ContextName、SearchEngine、TopX等的上下文表,并将其连接到一个搜索表,假设您在这里进行某种缓存以获得结果

类似于

SELECT * FROM Searches s  
  INNER JOIN Context ct ON sr.search = ct.search
  WHERE sr.rank <= ct.TopX
  AND   (searchterm = ... etc )
UNION
SELECT * FROM (SELECT s.*, rank() OVER (partition by search_term,search order by rank asc), FROM Searches s ORDER BY rank ASC)
  INNER JOIN Context ct ON sr.search = ct.search
  WHERE sr.rank <= ct.BottomX
  AND   (searchterm = ... etc )

显然,在其他地方这样做更为常见,但如果您在SQL中保留行为逻辑,则可以执行以下操作之一

使用参数

把东西传给手术室。比如说

Create Proc sp_Search (@Search varchar(500), @behavior int)
AS

if @behavior = 1
 ...
if @behavior = 2
...
但是,这需要应用程序了解此参数,而这可能不是您想要做的

使用有关会话的内容

您还可以使用有关会话的信息。比如说

使用特定用户

另一种选择是将用户名分配给他们将要使用的上下文,然后再使用

创建程序sp_Search@Search varchar500 作为


老实说,我宁愿允许任何应用程序的任何行为使用该机制,然后为每个应用程序配置策略,而不是像上面那样将该机制和策略捆绑在一起

每当您有多种算法/技术/方法来实现一个目标,并且希望在运行时决定使用哪种技术时,你应该考虑使用这个模式。


策略经常与模式相结合。基本上,调用FactoryMethod,传递决策所需的任何数据。它封装了实际的决策逻辑,并返回相应策略对象的实例。

有面向对象的SQL编程吗?另外,当您从web应用程序和控制台应用程序调用DB时,为什么要在SQL中尝试这样做。web/控制台应用程序似乎是处理这类事情的合乎逻辑的地方……有没有好的理由阻止客户端决定它想要做什么样的搜索?我喜欢其他人已经介绍过的参数示例,因为它使数据库不再需要了解特定的客户机上下文。我宁愿在我的应用程序和数据库之间设置一个服务来强制调用正确版本的存储过程,也不愿教数据库太多关于应用程序的知识。过多地向数据库介绍其客户机往往会导致可维护性和/或可预测性问题。有什么原因你不能/不应该从这个角度来处理它吗?@Pete M,我不能这样做的原因是DB将结果集写到一个表中,因为我们的搜索词词汇量有限。这种机制可以帮助我们避免一遍又一遍地执行计算,我不明白这会如何阻止应用程序传递一个参数,指示数据库应该执行哪种类型的搜索。我想问的是,为什么应用程序不应该被允许告诉数据库搜索要做什么,而不是数据库根据调用它的人的一些知识来决定它自己做什么。我强烈建议使用参数方法,除非有充分的业务/技术理由使用其他两种方法。
Create Proc sp_Search (@Search varchar(500))
AS

if APP_NAME()=  'Application A'
 ...
if APP_NAME()= 'Application B'
...
if CURRENT_USER()=  'ConsoleCreds'
 ...
if  CURRENT_USER()= 'WebCreds'
...