我正在创建一个创建文件目录的应用程序。目录的数据将通过NHibernate存储在数据库中,但实际文件只存储在文件系统中。我已经将文件系统的接口抽象为一个名为IFileSystemAdaptor
的接口。
当从数据库持久化对象时,我需要设置其IFileSystemAdaptor FileSystemAdaptor
属性,以便其方法和属性可以访问文件系统。
例如,用户稍后可以在持久对象上调用AddAttachment(string filename, Stream data)
。这将导致它通过其IFileSystemAdaptor
将流写入指定的文件名,并将新文件名添加到其AttachmenFileNames
属性中,该属性稍后将保存到数据库中。
在哪里可以插入代码来设置数据库中持久化对象的FileSystemAdaptor
属性?我应该在Session / SessionFactory之间添加一个抽象层,在返回对象之前设置FileSystemAdaptor
属性吗?或者有一些我可以将这个功能注入SessionFactory
,以便它返回已设置FileSystemAdaptor
的对象?
答案 0 :(得分:1)
您可以在从数据库获取实体后编写IPostLoadEventListener来设置属性。或者使用custom bytecode provider为您的实体注入IFileSystemAdaptor实现。
答案 1 :(得分:0)
我认为这是基础设施问题。您的业务逻辑可以与IFileSystemAdaptor交互,您可以使用Inversion of Control将FileSystemAdaptor的具体实例传递给您的业务逻辑(接口和具体实例之间的映射将在web.config或app.config中定义)。这将允许您创建传递FileSystemAdaptor的模拟实例的单元测试,这样您的业务逻辑就不会依赖于文件系统。
我建议在专用于基础架构问题的层/项目中实现该类,或者可能建议用于应用程序逻辑的“应用程序服务”层,而不是业务逻辑。
答案 2 :(得分:0)
另一个(可能不受欢迎?)选项可能只是为此使用服务位置。我发现这是为实体提供有限服务的一种可接受的方式,而不会涉及使用自定义字节码提供程序等的复杂性。