如何重构这个?

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)

我有两种类型的工作文档,但我似乎无法轻易地将上述两种方法(AttemptContractRetrievalAttemptAssignmentRetrieval)重构为一个体面的形式.

任何帮助将非常感激.

问候,吉姆.

Ale*_*x H 5

在个人情况下,我会考虑使用工厂方法的工厂模式或构建器模式.

在企业库解决方案中可以看到工厂模式的良好使用,例如:Database.CreateDatabase();
我想说这将是最直接的整合.

如果您选择了Builder模式,需要创建更复杂的对象,那么您可以将复杂对象的创建分离为一系列构建命令,例如:vehicleBuilder.BuildFrame(); vehicleBuilder.BuildEngine(); vehicleBuilder.BuildWheels(); vehicleBuilder.BuildDoors();

然后在这些方法中,根据您选择的实现,您可以添加您的复杂性,但使方法调用和构造非常直接.

如果您还没有遇到过它,http://www.dofactory.com是一个不错的选择.