用于向项目添加资源的设计

时间:2010-07-06 13:34:56

标签: c# design-patterns

我有课程项目资源文件

项目包含资源的列表 每个资源都包含特定类型的文件的列表。

这映射到XML:

<Project>
<Resource id=1>
<File id="1" path="" type="A" />
<File id="2" path="" type="B" />
<File id="3" path="" type="B" />
<File id="4" path="" type="B" />
</Resource>
<Resource id=2>
<File id="1" path="" type="A" />
<File id="2" path="" type="B" />
<File id="3" path="" type="B" />
<File id="4" path="" type="B" />
</Resource>    
</Project>

因此,基本上每个资源必须至少有一个类型为“A”的文件和任意数量的“B”类型的文件。用户从对话框中选择文件类型,然后选择文件并添加到资源。

问题是对于每个类型为“A”的文件,我需要创建一个新的资源,因此需要用XML创建新的节点。(我目前的代码无法做到)

最初我带有以下内容(为简洁起见)

    Project p =new Project("Untitled project"); //Will happen once per project
    Resource res = p.CreateProjectResource("resource1"); 
                  //various params to create resource 
    p.AddResource(res);

    //now lets add files to a resource 
    AddFileHelper(res,"C:\myfile1.bin","A",guid.toString()); 
    AddFileHelper(res,"C:\myfile32.bin","B",guid.toString());
    AddFileHelper(res,"C:\myfile56.bin","B",guid.toString());


    //The next statement should create a new resource and add the  file to 
    //the new created design
    AddFileHelper(res,"C:\myfile4.bin","A",guid.toString()); // 

   //some helper class     :
    //Adds a file of type "type" to a resource "res" with file ID as "id" 
    private AddFileHelper(Resource res,string path,FileType type,string id)
    {
         // path is user defined file path from OpenFile dialog, 
        //type is selected from a Dropdown (of Enum values "A","B",...)
        //id is GUID
        res.AddFile(path,type,id); 

       //************ OR it could be also written as  *******
       //ResFile file =new ResFile(path,type,id); 
       //res.AddFile(file);  

       //Update XML file here.. 
    }

主要问题是用户没有“显式”创建资源(第一个资源除外),新资源的创建取决于用户添加的文件类型。

同样由于这种设计,很难找出给定文件ID的资源。 唯一的跟踪方法是在每个Resource类中使用文件集合。

任何帮助??

全部谢谢。

这是参考我在post

之前提出的问题

1 个答案:

答案 0 :(得分:1)

我理解的问题是:

截至目前,您的AddFileHelper仅将文件添加到标有''resource1''的项目资源,这是一个问题,因为每次文件类型“A”传递给您的AddFileHelper时,您都要为其创建新资源您的项目(''resource2'')并将其添加到该项目中。

有一种非常简单的方法可以做到这一点。在AddFileHelper内测试添加文件的FileType,并确定是否需要将新资源添加到项目中。如果类型不是“A”,您将调用现在的代码并添加文件:

res.AddFile(path, type, id);

如果要添加的类型是“A”并且您需要新资源,只需重新定义res并增加一个计数器变量,该变量包含项目中的资源数量:

Resource res = p.CreateProjectResource(resourceName);
resourceCounter++;

resourceName是字符串:

string resourceName = ''resource'' + resourceCounter;

所有这些都应该作为AddFileHelper方法实现。

关于代码的整体结构,AddFileHelper应该是项目类方法。这就是原因:

AddFile方法和AddFileHelper方法听起来相似但做了两件非常不同的事情。 AddFile方法属于资源类,因为它作用于定义良好的资源对象。但是,AddFile方法对于您的目的来说还不够,因为要附加到的资源文件对于拥有文件并希望将其添加到项目的客户端来说并不是很明显。在可以调用AddFile方法之前,需要确定目标资源。 AddFileHelper方法的工作是确定哪个资源将调用AddFile方法。因此,AddFileHelper方法属于项目类,属于资源类的AddFile方法。

如果将方法重命名为AddFileHelper或类似的方法,FileResourceAssignment方法和项目类之间的逻辑连接可能会更明显。