StructureMap: «Не определен экземпляр по умолчанию для плагина» - даже если это - PullRequest
3 голосов
/ 07 апреля 2010

Я использую StructureMap около 6 месяцев; вы бы подумали, что станет легче. Кажется, нет.

Вот первая строка моего реестра:

            For<IDbConnection>()
            .Singleton()
            .Use<SqlConnection>()
            .Ctor<string>(WebConfigurationManager.ConnectionStrings["UnifiedConnectionString"].ConnectionString);

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

            return MsSqlConfiguration.MsSql2008.ConnectionString(((DbConnection)ObjectFactory.GetInstance<IDbConnection>()).ConnectionString);

Я получаю

StructureMap Exception Code:  202
No Default Instance defined for PluginFamily System.Data.IDbConnection, System.Data,
 Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Теперь я могу что-то упустить (хорошо, я, очевидно, так), но я не знаю, насколько яснее я могу определить экземпляр по умолчанию для IDbConnection. Что я делаю не так?

Редактировать: По запросу Джошуа, я добавляю полный код для минимального случая.

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

Во-первых, мое консольное приложение:

       static void Main(string[] args)
    {
        Debug.Print("Connection String: {0}", ConfigurationManager.ConnectionStrings["UnifiedConnectionString"].ConnectionString);
        (new Bootstrapper()).BootstrapStructureMap();

    }

Затем мой модуль Bootstrapper, снятый с рабочего приложения:

    public class Bootstrapper : IBootstrapper
{
    public  void BootstrapStructureMap()
    {
        ObjectFactory.Initialize(x =>

                x.Scan(s =>
                {
                    s.WithDefaultConventions();
                    s.TheCallingAssembly();
                    s.LookForRegistries();
                }
                    )
        );
        Debug.Print(ObjectFactory.WhatDoIHave());
        try
        {
            ObjectFactory.AssertConfigurationIsValid();
        }
        catch (StructureMapConfigurationException ex)
        {
            string msg = ex.ToString();
            throw;
        }
        catch (Exception ex)
        {
            string msg = ex.ToString();
            throw;
        }
        InitAutoMapper();
    }

И, наконец, DependencyRegistry, взятое из производственного приложения, но со всем, кроме первого комментария, закомментировано.

    public class DependencyRegistry : Registry
{
    public DependencyRegistry()
    {     
        For<IDbConnection>()
            .Singleton()
            .Use<SqlConnection>()
            .Ctor<string>(ConfigurationManager.ConnectionStrings["UnifiedConnectionString"].ConnectionString);
        //For<...
    }
}

Теперь, когда я запускаю это, я получаю то, что он делает это через "WhatDoIHave ()", но выдает исключение SM 205 в AssertConfigurationIsValid (). Ошибка (по-видимому) возникает при попытке создать экземпляр SqlConnection, говоря: «Отсутствует запрошенное свойство экземпляра \» connectionString \ »для InstanceKey».

Вот текст сообщения:

StructureMap.Exceptions.StructureMapConfigurationException:

Ошибка сборки в экземпляре 'a54d3ca1-33b5-4100-82d4-13e458f57a3f' (настроенный экземпляр System.Data.SqlClient.SqlConnection, System.Data, версия = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934089) для PluginType System.Data.IDbConnection, System.Data, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089

StructureMap.StructureMapException: Код исключения StructureMap: 205 Отсутствует запрошенное свойство экземпляра "connectionString" для InstanceKey "a54d3ca1-33b5-4100-82d4-13e458f57a3f" в StructureMap.Pipeline.ConstructorInstance. <. ctor> b__0 (строковый ключ) at StructureMap.Util.Cache 2.get_Item(KEY key) at StructureMap.Pipeline.ConstructorInstance.Get(String propertyName, Type pluginType, BuildSession session) at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session) at StructureMap.Pipeline.Arguments.Get[T](String propertyName) at lambda_method(ExecutionScope , IArguments ) at StructureMap.Construction.BuilderCompiler.FuncCompiler 1. <> c__DisplayClass2.b__0 (аргументы IArguments)

... (Надеюсь, ничего не удалено для пробела) ...

Сбои StructureMap: 1 Ошибка сборки / конфигурации и 0 Ошибки проверки

at StructureMap.Container.AssertConfigurationIsValid () at StructureMap.ObjectFactory.AssertConfigurationIsValid () в ConsoleIoCTest.Bootstrapper.BootstrapStructureMap () в U: \ dave \ VS2008Projects \ FMSWeb \ FMSWeb \ ConsoleIoCTest \ Bootstrapper.cs: строка 29

Есть все это? Я тоже. Почему он говорит, что отсутствует ключ конструктора «connectionString», когда я передаю его в качестве аргумента .ctor?

Спасибо, и извините, что заняли все это пространство.

1 Ответ

4 голосов
/ 10 сентября 2010

Я думаю, что ваша проблема в том, что вы пропустили "Is part" инструкции зависимости Ctor.

...