Исключение StructureMap: для PluginFamily не определен экземпляр по умолчанию - PullRequest
5 голосов
/ 18 февраля 2010

У меня есть класс SysMsgManager, определенный в проекте CoreService следующим образом:

public class SysMsgManager 
{
    private ISysMsgRepository _SysMsgRepository;

    public SysMsgManager()
    {
        _SysMsgRepository = ObjectFactory.GetInstance<ISysMsgRepository>();
    }

    ....
}

В моем проекте DataAccess у меня есть интерфейс ISysMsgRepository и две конкретные реализации, определенные следующим образом:

namespace DataAccess.Repository
{
   [Pluggable("Default")]
   public class SysMsgRepository : ISysMsgRepository
   {
      ...
   }
}

namespace DataAccess.Repository
{
    [Pluggable("Stub")]
    public class SysMsgRepository_Test : ISysMsgRepository
    {
        ...
    }
}

и это то, что у меня есть в моем файле StructureMap.config

<StructureMap>

<Assembly Name="CoreService" /> 
<Assembly Name="DataAccess" />

<PluginFamily
    Assembly="DataAccess"
    Type="DataAccess.Repository.ISysMsgRepository"
    DefaultKey="Default" />

</StructureMap>

Когда я пытаюсь запустить свое приложение, я получаю следующую ошибку:

Код исключения StructureMap: 202 \ nНет экземпляра по умолчанию, определенного для PluginFamily DataAccess.Repository.ISysMsgRepository, DataAccess, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null

Может кто-нибудь помочь мне решить эту проблему? Спасибо!

1 Ответ

8 голосов
/ 18 февраля 2010

К сожалению, я мало знаком с настройкой StructureMap через Xml.Позвольте мне показать вам, как это делается с использованием C #.

var container = new Container(config=>
{
  config.For<ISysMsgRepository>().Use<SysMsgRepository>();
});

Кажется, вы используете стандартное соглашение об именах для ваших интерфейсов и классов (просто добавив I в начало имени класса).Если вы делаете это для всех типов, вы можете просто настроить свой контейнер следующим образом:

var container = new Container(config=>
{
    config.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.WithDefaultConventions();
    });
});

Надеюсь, это поможет.Намного проще настроить ваш контейнер, используя код, а не Xml.Попробуйте.Вы будете новообращенным.

...