2015-06-11 2 views
0

Я начну это, сказав, что я довольно новичок, поэтому я могу сделать очень простую ошибку, но я просто не вижу этого. У меня есть следующий завод:Создание экземпляра с использованием заводского исключения бросания

using System; 
using System.Collections.Specialized; 
using System.Configuration; 

namespace SportsCardInventory.Services 
{ 
    public class Factory 
    { 
     public IService GetService(string servicename) 
     { 
      Type type; 
      Object obj = null; 

      try 
      { 
       string ImplName = GetImplName(servicename); 
       type = Type.GetType(ImplName); 
       //obj = Activator.CreateInstance(type); 
       obj = Activator.CreateInstance(typeof (ICreateCollection)); 
       return (IService)obj; 
      } 
      catch (Exception e) 
      { 
       Console.Write(e); 
       throw; 
      } 
     } 

     private string GetImplName(string servicename) 
     { 
      NameValueCollection settings = ConfigurationManager.AppSettings; 
      return settings.Get(servicename); 
     } 
    } 
} 

И следующий интерфейс:

using SportsCardInventory.Domain; 

namespace SportsCardInventory.Services 
{ 
    interface ICreateCollection:IService 
    { 
     bool CreateCollection(CardCollection newCollection); 
    } 
} 

И следующая реализация:

using System; 
using System.Collections; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 
using SportsCardInventory.Domain; 

namespace SportsCardInventory.Services 
{ 
    class CreateCollectionImpl:ICreateCollection 
    { 
     public string CollectionName; 
     public ArrayList CardCollection; 
     public bool CreateCollection(CardCollection newCollection) 
     { 
      if (newCollection == null) throw new ArgumentNullException("newCollection"); 
      StoreCollection(newCollection); 
      return true; 
     } 

     private void StoreCollection(CardCollection newCollection) 
     { 
      string fileName = newCollection.CollectionName + ".bin"; 
      FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write); 
      IFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(fileStream, newCollection); 
      fileStream.Close(); 
     } 
    } 
} 

Я пытаюсь выполнить следующий тест блока:

using System.Collections; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using SportsCardInventory.Domain; 
using SportsCardInventory.Services; 

namespace ServicesTest 
{ 
    [TestClass] 
    public class CreateCollectionImplTest 
    { 
     [TestMethod] 
     public void TestMethodCreateCollection() 
     { 
      bool testPassed; 
      ArrayList testArrayList = new ArrayList(); 
      CardCollection testCollection = new CardCollection("TestCollection", testArrayList); 
      Factory factory = new Factory(); 
      IService createCollectionService = (IService)factory.GetService("ICreateCollection"); 
     } 
    } 
} 

И я получаю следующее исключение:

Test method ServicesTest.CreateCollectionImplTest.TestMethodCreateCollection threw exception: 

System.MissingMethodException: Cannot create an instance of an interface. 
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, ref Boolean canBeCached, ref RuntimeMethodHandleInternal ctor, ref Boolean bNeedSecurityCheck) 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, ref StackCrawlMark stackMark) 
    at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, ref StackCrawlMark stackMark) 
    at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
    at System.Activator.CreateInstance(Type type) 
    at SportsCardInventory.Services.Factory.GetService(String servicename) in Factory.cs: line 25 
    at ServicesTest.CreateCollectionImplTest.TestMethodCreateCollection() in CreateCollectionImplTest.cs: line 18 

System.MissingMethodException: Cannot create an instance of an interface. 
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) 
    at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) 
    at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
    at System.Activator.CreateInstance(Type type) 
    at SportsCardInventory.Services.Factory.GetService(String servicename) in c:\Users\jfshinevar\Desktop\SCIRefactored\SportsCardInventory\SportsCardInventory\Services\Factory.cs:line 19 

Я не в полной мере понять, что происходит, и я чувствую, что я чеканка возможности, и каждый из них вызывает больше проблем. Может ли кто-нибудь помочь мне понять, почему мне сложно создавать экземпляр CreateCollectionImpl, поэтому я могу тестировать возможность создания коллекции и записать ее на диск? Заранее спасибо.

+1

Как сейчас, ваш код пытается создать жестко закодированный интерфейс ICreateCollection и терпит неудачу. Вы прокомментировали линию, которая попытается найти конкретный тип –

+0

@PanagiotisKanavos, вы правы. Я жестко закодировал это, потому что это то, что у меня было в файле app.config. Похоже, я поместил неправильный элемент в файл app.config. Мне нужно заменить ключ ICreateCollection на CreateCollectionImpl, а затем вернуть прокомментированную строку, которая ищет конкретный тип. – BigDevJames

ответ

1

Вы просто передаете имя интерфейса, вам нужно передать конкретное имя класса, чтобы установить его.

Как вы его называете, он попытается создать экземпляр интерфейса.

+0

ОК, это определенно решило проблему. Теперь, я думаю, мне просто нужно изменить ключ в файле app.config, чтобы ссылаться на реализацию вместо интерфейса. Я остановил использование файла app.config для устранения неполадок. Я должен подождать несколько минут, пока не смогу принять ваш ответ, но это сработало. – BigDevJames

 Смежные вопросы

  • Нет связанных вопросов^_^