gpt4 book ai didi

.net - 关于 MEF 战略和结构的问题

转载 作者:行者123 更新时间:2023-12-01 01:05:31 25 4
gpt4 key购买 nike

我的任务是模块化一个 C# 应用程序,它是一个非常大的 Delphi 应用程序的重写(数据库有 249 个表!)。业务限制禁止对 .NET 进行完全重新设计和更好的整体架构,因此我们基本上只是在 C# 中为 Delphi 应用程序的模块逐步重写模块。在完成之前,该套件将包含待处理的重写以及我想使用 MEF 集成的 C# 应用程序模块。

该应用程序关注考勤和访问控制,并具有不同的业务领域,如“员工休假”和“访客”。我认为这些应该是单独的项目,我们可以在其中换出一个重写的 C# 项目,并将其导入到 MEF 容器中。每个项目将导出一个 IBusinessArea ,作为最高级别的定义,那么这些将导出标准的共享接口(interface),如 IService ,介绍业务领域中可用的服务,如 CreateEmployee .每个服务都会是一个类,为了规范服务与容器的接口(interface),并包含服务元数据,如Command对于服务,谁可以使用该服务的数据等。

我是否朝着正确的方向前进,如果是,我如何存储和公开IBusinessAreaIService元数据作为类,而不是大量无类型的元数据属性?

最佳答案

到目前为止,你所说的一切对我来说都是合理的。您将某些区域模块化,在不同的抽象级别上定义接口(interface),并使用不同的接口(interface)导出每个模块,即每个模块将注册为其实现的多个接口(interface)。您将能够根据您需要的抽象级别解析您的模块,获得所有服务、所有业务领域等。所以,在我看来,您正朝着正确的方向前进。

如何处理元数据? MEF 提供元数据的导出,这似乎是一个合理的使用方法。也许我没有完全明白,但我在 MEF 元数据导出方面的经历非常糟糕。据我记忆,MEF 将元数据存储为键值对,其中键是字符串。

即使您使用类型化元数据导出和使用功能,元数据也不是真正类型安全的。假设你有一个接口(interface) 'IMetadata' 和一个名为 'PropertyA' 的属性,并且你注册了一个类型(为了创造性,我们称之为 Foo),它装饰有一个相应的属性,MEF 称之为类型安全,方式(实现 IMetadata 的元数据)。现在假设您有第二个元数据接口(interface)“IMetadataB”,它也有一个名为 PropertyA 的属性。 .如果您现在请求解决 Foo带有元数据 IMetadataB您将首先获得您注册的实例,因为 MEF 对 PropertyA 感到满意存在于元数据键值对中并构建相应的代理元数据类型,该类型实现 IMetadataB .

长话短说,也许我对 MEF 不公平,但我停止使用 MEF 内置的元数据支持,并建议您也这样做。

由于我正在处理非常复杂且冗长的元数据,包括我希望与导出的类紧密耦合的类文档,我开发了一个对我来说非常有效的系统,尽管它有点不合常规:

基本上,我为我的元数据定义了一个接口(interface)和一个基类,比如 MetadataBase带有一个名为 Description 的字符串属性.

public class MetadataBase : IMetadata
{
public string Description { get; set; }
}

之后,对于我想要为其获取元数据的每个类,我从该基类派生一个类 ( FooMetadata ) 并在 XAML 中部分定义它。然后,在 XAML 中,我定义属性的类特定值,例如:
<md:MetadataBase.Description>
The description of my class goes here
</md:MetadataBase.Description>

使用自定义属性,我将元数据类型与我的实际类相关联:
[Export(typeof(IFoo))]
[AssociatedMetadata(typeof(FooMetadata))]
public class Foo : IFoo
{
// Whatever
}

对象的扩展方法允许您通过反射读取元数据:
public static IMetadata GetMetadata(this object objectWithMetadata)
{
// Read attribute type
// Create instance of the metadata type, i.e. FooMetadata
// A caching mechanism can be implemented, if needed, but, honestly,
// my really big metadata objects including images and stuff like this
// are created within 3-5 ms
// Return this instance
}

现在,您基本上就在那里,您可以读取任何具有如下元数据的对象的元数据:
var myObjectsMetadata = myObject.GetMetadata();

您可以在创建 AssociatedMetadataAttribute 时在 MEF 中使用此元数据。实现一个接口(interface)并使用此接口(interface)的元数据注册您的类型。什么都不会混淆,因为对于拥有一个属性而没有其他任何东西(类型)的所有内容,您都有一种类型的元数据。

这个解决方案不是解决所有问题的正确方法,但我喜欢它,你的问题是展示它的好机会。希望能帮助到你!

关于.net - 关于 MEF 战略和结构的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19131916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com