Jim*_*meh 1 c# design-patterns
关于我如何将其重构为一个体面的模式,我正在努力解决一个小问题.
public class DocumentLibrary
{
private IFileSystem fileSystem;
private IDocumentLibraryUser user;
public DocumentLibrary(IDocumentLibraryUser user) : this(user, FileSystemFrom(user)) { }
public DocumentLibrary(IDocumentLibraryUser user, IFileSystem fileSystem)
{
this.user = user;
this.fileSystem = fileSystem;
}
public void Create(IWorkerDocument document)
{
document.SaveTo(fileSystem);
}
public IWorkerDocument AttemptContractRetrieval()
{
return new Contract(fileSystem, user);
}
public IWorkerDocument AttemptAssignmentRetrieval()
{
return new Assignment(fileSystem, user);
}
private static IFileSystem FileSystemFrom(IDocumentLibraryUser user)
{
var userLibraryDirectory = new DirectoryInfo("/DocLib/" + EnvironmentName() + "/" + user.Id);
return new FileSystem(userLibraryDirectory);
}
private static string EnvironmentName()
{
using (var edmxContext = new Entities())
{
return (from setting in edmxContext.EnvironmentSettings
where setting.Name == "EnvironmentName"
select setting.Value).First();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有两种类型的工作文档,但我似乎无法轻易地将上述两种方法(AttemptContractRetrieval和AttemptAssignmentRetrieval)重构为一个体面的形式.
任何帮助将非常感激.
问候,吉姆.
在个人情况下,我会考虑使用工厂方法的工厂模式或构建器模式.
在企业库解决方案中可以看到工厂模式的良好使用,例如:Database.CreateDatabase();
我想说这将是最直接的整合.
如果您选择了Builder模式,需要创建更复杂的对象,那么您可以将复杂对象的创建分离为一系列构建命令,例如:vehicleBuilder.BuildFrame(); vehicleBuilder.BuildEngine(); vehicleBuilder.BuildWheels(); vehicleBuilder.BuildDoors();
然后在这些方法中,根据您选择的实现,您可以添加您的复杂性,但使方法调用和构造非常直接.
如果您还没有遇到过它,http://www.dofactory.com是一个不错的选择.
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |