如何在中解耦。网络?[英] howto decouple in .NET?

问题描述

这更像是一个 C# 问题而不是 C++ 问题,但我最好的机会
通过与 C++ 的比较来解释它.

好的:

在 C++ 中,您可以前向声明一个类型.那么对该类型的引用可以是
以类型安全的方式传递而不引入对
的依赖类型.只有需要访问成员的用户才需要类型定义.

C# 泛型提供了类似的功能,您可以将类型视为
不透明.但是 C# 和 .NET 假设 type 参数将采用
不同的价值观,这不是我想要的.这样做的一个影响是
而 C++ 前向声明可用于所有代码并自动
在任何地方都指同一个类型,为了在C#中获得相同的效果,类型
争论会像癌症一样蔓延.此外,由于 C# using 指令位于
命名空间范围,您不能使用它们来模拟 typedef,传递类型
隐含地来回争论.我正在寻找的是一个模块范围的
一组类型参数.

哦...我刚刚有个想法...让我看看C#是否支持通用静态
类.这可能会缓解未定义类型的普遍传播.
实际上,我可能不想将类本身声明为静态,因为那
防止继承.我心中的 C++ 程序员一想到
就畏缩不前使用 C# 部分类作为更强大的命名空间,但它可能只是

推荐答案

这更像是一个 C# 问题而不是 C++ 问题,但我最好的机会
通过与 C++ 的比较来解释它.

好的:

在 C++ 中,您可以前向声明一个类型.那么对该类型的引用就可以
以类型安全的方式传递而不引入对
的依赖类型.只有需要访问成员的用户才需要类型定义.

C# 泛型提供了类似的功能,您可以将类型视为
不透明.但是 C# 和 .NET 假设 type 参数将采用
不同的价值观,这不是我想要的.这样做的一个影响是
而 C++ 前向声明适用于所有代码和
自动到处引用同一个类型,达到同样的效果
在 C# 中,类型参数会像癌症一样传播.另外,由于 C# 使用
指令在命名空间范围内,你不能用它们来模拟一个
typedef,隐式地来回传递类型参数.我是什么
寻找的是一组模块范围的类型参数.

哦...我刚刚有个想法...让我看看C#是否支持通用静态
类.这可能会缓解未定义类型的普遍传播.
实际上,我可能不想将类本身声明为静态,因为
防止继承.我内心的 C++ 程序员对
感到畏缩曾想过使用 C# 分部类作为更强大的命名空间,但它
可能只是工作.
如果我正确理解你的问题,我认为我见过的通常方式
这是通过接口解决的.
我的几个使用 C# 进行大型项目的客户的指导方针是
指定一个类始终是 x 接口的实现,带有very
几乎没有"自己的"方法或属性.

这样,他们将接口(如果你愿意,有点像 COM)传递给不同的
地方.
这消除了对前向声明的需要,并增加了约束
如果你需要从一件事转换到另一件事,你有运行时类型
检查而不是编译时类型检查

不确定这是否对您有帮助,但也许有用.

--
亲切的问候,
Bruno van Dooren MVP - VC++
http://msmvps.com/blogs/vanDooren
br**********************@hotmail.com

嗨,本,

是的,我同意在 C# 新闻组中发帖将获得更多 C# MVP 和
专家回复/想法.我不确定我是否完全理解你.

为什么不试试 System.Type 作为静态类的成员?

静态类A
{
公共 TypeArg1 作为 System.Type
}

谢谢.

最好的问候,
杰弗里·谭
微软在线社区支持
====================================================
通过电子邮件收到我的帖子的通知?请参考
http://msdn.microsoft.com/subscripti...ult.aspx#notif


注意:MSDN 托管新闻组支持产品适用于非紧急问题
来自社区或 Microsoft 支持的初步回复
工程师在 1 个工作日内是可以接受的.请注意,每次关注
向上响应可能需要大约 2 个工作日作为支持
与您合作的专业人士可能需要进一步调查才能联系到
最有效的解决方案.该产品不适合情况
需要紧急、实时或基于电话的交互或复杂的交互
项目分析和转储分析问题.这种性质的问题是最好的
通过联系
处理与专门的 Microsoft 支持工程师的合作Microsoft 客户支持服务 (CSS),位于
http://msdn.microsoft.com/subscripti...t/default.aspx.
====================================================
此张贴按"原样"提供.不提供任何保证,也不授予任何权利.


如果我正确理解您的问题,我认为这是我见过的通常方式
这是通过接口解决的.
我的几个使用 C# 进行大型项目的客户的指导方针是
指定一个类始终是 x 接口的实现
很少甚至没有"自己的"方法或属性.

这样,他们将接口(如果你愿意,有点像 COM)传递给不同的
地方.
这消除了对前向声明的需要,并增加了约束
如果你需要从一件事转换到另一件事,你有运行时类型
检查而不是编译时类型检查
我想我明白你的意思了.我不太喜欢关于
的部分

我有一个各种各样的小部件系统.每个小部件都可以,为简单起见
为了,生成警报并公开操作.我想把代码分开
处理这两个问题.也就是说,报警记录器应该是
无需参考代码即可收集所有小部件的警报
声明你可以用一个操作做什么.调整按钮
wazzit count 应该可以找到并运行正确的操作,无需
关心警报.而恐慌系统是基于两者的,需要
监视关键警报并在小部件上调用重置操作
引起了警报.

有了接口,我可以让组件实现 IAlarmSite 和
IWithOperations.警报类型可以具有类型
的生产者属性报警站点.wazzit 调整按钮可以使用
中的方法IWithOperations.但是……恐慌系统有问题.它可以找出来
什么IAlarmSite引起了严重的警报,但是没有方法
运行重置操作,因为这些是 IWithOperations 的一部分.
运行时演员表.

在 C++ 中没有问题.警报类型只能有一个转发
组件类的声明并从
返回一个指向它的指针获取生产者().组件类可以公开一个 OperationSet*,其中
也是不完整的类型.报警记录器包括组件
定义和警报定义,并可以获取有关发生的详细信息和
在哪里.wazzit 调整器可以包含组件定义和
操作集定义并将所有警报内容保留为不完整的类型.
恐慌系统可以包括所有这三个.唯一的问题是如果
你对你的makefile依赖系统不小心,你可能会得到
违反 ODR.

具有泛型的 ..NET 甚至有可能解决这个问题,给
完美的类型安全(C++ 模板也可以工作,除了需要
将所有内容编译在一起).

通用<类型名组件>
其中组件:IAarmSite
公共参考类警报
{
...
属性组件^生产者
{
组件^ get( void ) { ... }
}
};

公共参考类 ComponentImpl : IAlarmSite, IWithOperations
{
typedef 告警...

BroadcastAlarm(gcnew Alarm());

...
};

等等.

但现在那些泛泛的论点像癌症一样不受控制地传播开来.

公共参考类 AlarmCollection
{
列表<报警^...;//哦哦,Alarm 需要一个类型参数
};

取2:

通用<类型名组件>
其中组件:IAarmSite
公共参考类 AlarmCollection
{
typedef 告警<组件告警;
列表<报警^...;//更好
};

取3:

通用<类型名组件>
其中组件:IAarmSite
公共参考类 AlarmConcern
{
公开:
参考类报警
{
...
};

参考类 AlarmCollection
{
...
};
};

公共参考类组件:AlarmConcern, IAlarmSite
{
};

这很漂亮."前向声明"是中心化的
自动分享.不再需要 typedef,这很好
因为它在 C# 中不可用.配置也是集中的,所以
替换模拟对象很容易.只有一个致命的问题.
继承是将泛型类拉入名称搜索的唯一方法
范围,而 .NET 只允许单一继承.C++/CLI 可以解决这个问题
中途,与:

公共参考类组件:IAlarmSite,IWithOperations
{
typedef AlarmConcern使用 AlarmConfiguration::Alarm;
使用 AlarmConfiguration::AlarmCollection;
typedef OperationsConcern//....
};

这已经不是很好了,因为它需要一个 using 声明
每堂课都需要.而且它在除 C++/CLI 之外的任何语言中都没有那么有用.
"使用"的 C# 版本不能在类内部使用,所以不能引用
一个通用参数.实际上,我不确定 C++/CLI 是否应该使用
"使用"或 typedef,因为名称不是来自基类.

我已经看到了很多请求,并且我自己也想要几次,是一个
一种"使用成员";指令,就像使用,除了它拉静态
类的成员(包括嵌套类型)进入名称搜索范围.但是
这是这样一个系统真正闪耀的地方......当用于
泛型的配置,具有任意嵌套.想象一下:

公共参考类组件:IAlarmSite,IWithOperations
{
使用成员 AlarmConcern<Component>;//语法 1
使用 OperationsConcern<Component>::*;//语法 2

...
};

这完全消除了从静态(密封
抽象)类.强大是因为通用配置可以
虽然通过了:

通用<类型名组件>
其中组件:IWithOperations
公共参考类 RemoteOperationsConcern
{
使用 OperationsConcern<Component>::*;

...
};

您能否建议一种方法来完成类似的事情,与现有的
C++/CLI 和 C# 语言?

本文地址:https://www.itbaoku.cn/post/1050562.html