2014-03-06 26 views
0

我在我的代码中使用了一个singleton类,它主要负责与设备进行通信。每次访问单例时调用一个方法

该类中的一个主要功能是ConnectToDevice(),该库中还有一个名为IsPhoneConnected()的方法。

所以基本上在任何其他方法被称为之前,一个简单的检查将连接设备,如果它尚未连接。因此,无论每个方法或每一个客户端应用程序调用我的图书馆的时候,有人负责书面方式follwoing代码

(!IsPhoneConnected()) 
{ 
    ConnectToDevice() 
    return IsPhoneConnected() // If phone is not connected, try to connect, if still not connected then return false. 
} 

我不想一次又一次地写这个逻辑的。我希望班级能够照顾到这一点,而不必一遍又一遍地调用这段代码。

有什么想法?

+0

命令模式?不是很清楚你在这里寻找什么...... – Wain

+1

Can;你可以在单身人士的'ConnectToDevice()'里面放置IsPhoneConnected()吗? – Szymon

+0

我可以。但是每个函数都会调用ConnectToDevice(),是否正确?我想最大限度地减少必须调用ConnectToDevice() – TeaLeave

回答

2

如果任何给定功能需要要连接的手机,它必须是交互在已有的方式连接单类。

在这种情况下,无论代码如何与单身内的电话进行交互,都可以调用ConnectToDevice()(如果它尚未连接)。

但是,如果你真的想要执行每次一组函数被调用的方法,而不必每次都显式调用,然后你在谈论的是编程面向方面。

这种范例不是C#原生的,但可以使用工具如PostSharp来模拟。

有关如何使用PostSharp将代码添加到您的代码的一个很好的教程,看看this CodeProject文章。

你可能最终的东西,如:

[PhoneConnectedAspect] 
private void DoStuffWithPhone 
{ 
    // your code here 
} 

标记有属性可以自动调用ConnectToDevice()方法,例如任何方法。

+0

非常感谢您的意见。他们非常有帮助。然而,无论如何,在类级别而不是方法级别[PhoneConnectedAspect],以便编译器知道这个方面正在为每个类的方法注入? – TeaLeave

1

像Baldrick说的:这听起来有点像面向方面的编程。不过,如果在库上调用任何方法需要连接电话,我会将ConnectToDevice嵌入到库本身中。例如。只需将其嵌入到需要连接电话的图书馆的每种方法中即可。

AOP会更好,但是这可以模拟它。

相关问题