Дизайн для добавления ресурсов в проект - PullRequest
2 голосов
/ 06 июля 2010

У меня есть классы Проект , Ресурс и Файл . где

A Проект содержит СПИСОК Ресурсы .
Каждый ресурс содержит LIST из файлов определенного типа.

Это сопоставлено с 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.. 
    }

Основная проблема заключается в том, что пользователь не создает ресурсы «явно» (кроме первого ресурса), а создание нового ресурса зависит от типа добавляемого пользователем файла.

Также из-за этого дизайна трудно определить Ресурс с заданным идентификатором файла. Единственный способ отследить это использование коллекции файлов в каждом классе ресурсов.

Любая помощь ??

Спасибо всем.

Это относится к вопросу, который я задавал до post

1 Ответ

1 голос
/ 06 июля 2010

Проблема как я понимаю:

На данный момент ваш 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 или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...