1

我有一点gesign问题(再次)。假设我有这个 Buttonpad 对象:

替代文字 http://img530.imageshack.us/img530/7513/buttonpad.jpg

现在这个对象是 com 对象中的一个包装对象。目前它有一个名为CreateInto(IComObject)的方法。现在在 Com 对象中创建一个新的按钮板。

你做:

 ButtonPad pad =  new ButtonPad();
 pad.Title =  "Hello";
 // Set some more properties.
 pad.CreateInto(Cominstance);

createinfo 方法将执行正确的命令以在 com 对象中构建按钮板。在它被创建之后,任何对它的调用都会被转发到底层对象进行更改,所以:

pad.Title = "New title";

将调用 com 对象来设置标题并设置内部标题变量。

基本上,在 CreateInfo 方法之前的任何调用都只会影响 .NET 对象,之后的任何东西都会产生调用 com 对象的副作用。我不太擅长序列图,但这是我试图解释发生了什么的尝试:

替代文字 http://img196.imageshack.us/img196/5885/seqa.jpg

这对我来说感觉不好,感觉就像我在向用户撒谎关于按钮板的作用。

我将有一个名为 WrappedButtonPad 的对象,它是从 CreateInto 返回的,用户可以调用它来更改 Com 对象,但我觉得有两个对象几乎做同样的事情但只是名称不同可能是更糟。

这些是有效的设计,还是我担心是对的?

您将如何处理可以创建和查询 com 对象的对象?

4

3 回答 3

0

我将允许 ButtonPad 创建自己的 ComInstance。我在您的序列图中注意到,ButtonPad 是唯一接触 ComInstance 的对象。所以把它放在内部。

于 2009-07-14T23:09:29.450 回答
0

我同意约翰的回答。

另一种选择是在实例化时将 ButtonPad 的内部状态复制到 COM 对象。

即:选项 1 (John's) 是从 ButtonPad 构造函数创建 COM 对象。

选项 2 是将 ButtonPad 的状态反映到 ButtonPad.CreatePad(...) 内的 COM 对象。ButtonPad.CreatePad(...) 会在 COM 对象上调用 CreateButtonPad,然后在返回之前在 COM 对象上调用 SetTitle() 等,以便 ButtonPad 确保 COM 对象的状态是一致的。

如果 ButtonPad 在没有 COM 对象的情况下存在是有意义的,或者如果您在实例化 ButtonPad 时无法访问实例化 COM 对象所需的 IComObject,我会更喜欢选项 2。否则我会选择选项1。

于 2009-07-14T23:29:07.910 回答
0

我首先要问:ButtonPad独立于它们隐藏的基础属性来操作属性的用例是什么?很可能有两个答案:1)没有一个,2)我们能够做到这一点至关重要。

第一种情况的答案非常简单:在您的类的构造函数中创建底层 COM 对象,将您的属性映射到它的属性上,然后就结束了。

但是,在第二种情况下,您将进入闻起来很像数据绑定的领域。你有一个数据源(你的对象),它绑定的东西(COM 对象),需要在这两个东西之间转换属性值(即解析和格式化,如果通信是双向的),甚至可能是一个需要通过事件通知映射属性更改。(例如,如果有其他东西操纵 COM 对象的属性,是否需要通知您的 .NET 对象?)

我并不是说您实际上想使用绑定来执行此操作,但我肯定会查看 .NET 数据绑定的设计方式,看看您实际需要多少该设计。

很可能,你会看着它说“哇,这真的很复杂。” 那是因为你想要做的事情从根本上说真的很复杂。如果您的设计没有实现关注点分离,情况会复杂得多。

于 2009-07-15T00:59:37.590 回答