AOP,DataMappers和Factories,它们可以一起工作吗?

时间:2009-07-18 01:56:40

标签: c# design-patterns c#-2.0

平台:C#2.0 使用:Castle.DynamicProxy2

我一直在努力寻找一个改写我的DAL的好策略。我试过NHibernate,不幸的是,它不适合我的项目。所以,到目前为止,我已经提出了这种互动:

我首先注册我的DTO和我的数据映射器:

MetaDataMapper.RegisterTable(typeof(User)):
MapperLocator.RegisterMapper(typeof(User), typeof(UserMapper));

这将使用DTO属性上的自定义属性来映射每个DTO:

[Column(Name = "UserName")]

然后我有一个属于每个DTO的Mapper,所以对于这种类型,它将是UserMapper。此数据映射器处理调用我的ADO.Net包装器,然后将结果映射到DTO。然而,我正在启用深度加载和随后的延迟加载,因此我陷入困境。基本上我的用户DTO可能有一个地址对象(FK),它需要另一个映射器来填充该对象,但我必须确定在运行时使用AddressMapper。

我的问题是处理类型而不必明确地查看它们的列表(更不用说每次我需要确定要返回哪个映射器时必须保持更新列表的头痛)。所以我的解决方案是使用我注册的MapperLocator类(如上所述)并返回我所有数据处理器实现的IDataMapper接口。然后,如果我正在处理User对象,我可以将其强制转换为UserMapper类型。但是,当我尝试确定在运行时返回的Data Mapper的类型时,这并不容易。由于泛型必须在编译时知道它们是什么,因此使用AOP然后在运行时传入类型不是不使用反射的选项。当我将DTO映射到表格,读取属性等时,我已经做了相当多的反思。另外,我的MapperFactory使用反射来实例化正确的数据映射器。所以我试图在没有反思的情况下这样做,尽可能地保持那些昂贵的电话。

我认为可以通过界面找到解决方案,但我还没有能够实现这个想法。那么我认为解决方案可能是使用委托,但我不知道如何实现这个想法。所以...坦率地说......我迷路了,你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

我会提出一些建议。

1)不要过早优化。如果你需要使用反射来实例化你的* Mappers,那就用反射做吧。不要那样做,看看你自己造成的头痛。如果您以后遇到问题,请对其进行分析,看看是否有更快的方法。

2)我的问题是,你为什么要尝试实现自己的DAL框架?你说NHibernate并不合适,但你没有详细说明。你有没有尝试过其他几十种ORM?你的标准是什么?您发布的代码看起来非常像Linq2Sql的映射。

Lightspeed和SubSonic都是非常轻量级的ORM套装。 Linq2Sql是一个易于使用的映射器,当然还有微软的实体框架,它有一个整个团队在微软处理你所描述的问题。

通过查看这些而不是自己实现,您可以节省很多时间,特别是维护。我强烈推荐我提到的那些。