当使用NHibernate从数据库持久保存对象时,如何设置其他属性?

时间:2010-09-17 22:19:12

标签: nhibernate orm persistence

我正在创建一个创建文件目录的应用程序。目录的数据将通过NHibernate存储在数据库中,但实际文件只存储在文件系统中。我已经将文件系统的接口抽象为一个名为IFileSystemAdaptor的接口。

当从数据库持久化对象时,我需要设置其IFileSystemAdaptor FileSystemAdaptor属性,以便其方法和属性可以访问文件系统。

例如,用户稍后可以在持久对象上调用AddAttachment(string filename, Stream data)。这将导致它通过其IFileSystemAdaptor将流写入指定的文件名,并将新文件名添加到其AttachmenFileNames属性中,该属性稍后将保存到数据库中。

在哪里可以插入代码来设置数据库中持久化对象的FileSystemAdaptor属性?我应该在Session / SessionFactory之间添加一个抽象层,在返回对象之前设置FileSystemAdaptor属性吗?或者有一些我可以将这个功能注入SessionFactory,以便它返回已设置FileSystemAdaptor的对象?

3 个答案:

答案 0 :(得分:1)

您可以在从数据库获取实体后编写IPostLoadEventListener来设置属性。或者使用custom bytecode provider为您的实体注入IFileSystemAdaptor实现。

答案 1 :(得分:0)

我认为这是基础设施问题。您的业​​务逻辑可以与IFileSystemAdaptor交互,您可以使用Inversion of Control将FileSystemAdaptor的具体实例传递给您的业务逻辑(接口和具体实例之间的映射将在web.config或app.config中定义)。这将允许您创建传递FileSystemAdaptor的模拟实例的单元测试,这样您的业务逻辑就不会依赖于文件系统。

我建议在专用于基础架构问题的层/项目中实现该类,或者可能建议用于应用程序逻辑的“应用程序服务”层,而不是业务逻辑。

答案 2 :(得分:0)

另一个(可能不受欢迎?)选项可能只是为此使用服务位置。我发现这是为实体提供有限服务的一种可接受的方式,而不会涉及使用自定义字节码提供程序等的复杂性。