Единство (в ПРИЗМЕ) (не) странное решение ... ?? !! - PullRequest
0 голосов
/ 04 декабря 2009

Я использую PRISM и в классе Bootstrapper я переопределил метод ConfigureContainer (). В этом нет ничего необычного, только эти строки:

protected override void ConfigureContainer()
{       
    Container.RegisterType<IDataContext, SQLDataContext>(new InjectionConstructor(@"Server=localhost\SQLExpress;User Id=sa;Password=xxxxx;Database=MyDatabase"));
        base.ConfigureContainer();
}

В «время отладки» я пытаюсь вызвать Container.Resolve (), но это дает мне следующую ошибку:

{"Не удалось разрешить зависимость, type = \" Photo.DAL.Abstract.IDataContext \ ", name = \" \ ". Сообщение об исключении: Текущая операция сборки (ключ сборки Ключ сборки [Photo.DAL. Concrete.SQLDataContext, null]) не удалось: значение не может быть нулевым. \ R \ nИмя параметра: stream (тип стратегии BuildPlanStrategy, index 3) "} System.Exception {Microsoft.Practices.Unity.ResolutionFailedException}

Но когда я это сделаю

Container.IsTypeRegistered(typeof(IDataContext))

Я получаю правду !!!

  • Чего мне не хватает ???

Информация, опубликованная в виде ответа ниже, должна быть изменена на вопрос:

Это полный стек:

Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Photo.DAL.Abstract.IDataContext", name = "". Exception message is: The current build operation (build key Build Key[Photo.DAL.Concrete.SQLDataContext, null]) failed: Value cannot be null.
Parameter name: stream (Strategy type BuildPlanStrategy, index 3) ---> Microsoft.Practices.ObjectBuilder2.BuildFailedException: The current build operation (build key Build Key[Photo.DAL.Concrete.SQLDataContext, null]) failed: Value cannot be null.
Parameter name: stream (Strategy type BuildPlanStrategy, index 3) ---> System.ArgumentNullException: Value cannot be null.
Parameter name: stream
   at System.Data.Linq.Mapping.XmlMappingSource.FromStream(Stream stream)
   at Photo.DAL.Mapping.GetMapping() in C:\Users\Savvas\Documents\Visual Studio 2008\Projects\Photo\Photo.DAL\Mapping.cs:line 18
   at Photo.DAL.Concrete.SQLDataContext..ctor(String connectionString) in C:\Users\Savvas\Documents\Visual Studio 2008\Projects\Photo\Photo.DAL\Concrete\SQLDataContext.cs:line 52
   at BuildUp_Photo.DAL.Concrete.SQLDataContext(IBuilderContext )
   at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)
   at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)
   at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
   --- End of inner exception stack trace ---
   at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
   at Microsoft.Practices.ObjectBuilder2.Builder.BuildUp(IReadWriteLocator locator, ILifetimeContainer lifetime, IPolicyList policies, IStrategyChain strategies, Object buildKey, Object existing)
   at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name)
   --- End of inner exception stack trace ---
   at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name)
   at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name)
   at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name)
   at Microsoft.Practices.Unity.UnityContainerBase.Resolve(Type t)
   at Microsoft.Practices.Unity.UnityContainerBase.Resolve[T]()
   at Photo.Desktop.Bootstrapper.ConfigureContainer() in C:\Users\Savvas\Documents\Visual Studio 2008\Projects\Photo\Photo.Desktop\Bootstrapper.cs:line 42

Я заметил, что ошибка связана не с фактическим разрешением класса, а с вызывающим методом GetMapping (), который определяется как

public static class Mapping
    {
        public static XmlMappingSource GetMapping()
        {
            XmlMappingSource mapping;
            using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Photo.DAL.Entities.Entities.map"))
            {
                mapping = XmlMappingSource.FromStream(stream);
            }
            return mapping;
        }
    }
  • Unity неспособен сделать это? (это сработало с Виндзором !!)

1 Ответ

0 голосов
/ 04 декабря 2009

Это может быть одна из двух вещей ... это не совсем ясно из вашего исключения ...

  1. Скорее всего, есть еще один внутренний исключение, которое может быть замаскировано?

  2. В противном случае может быть вашим Класс SqlDataContext имеет конструктор, который принимает поток?

Опять же, исключение не совсем понятно (по крайней мере, для меня). Если ни одно из этих предложений не поможет, не могли бы вы опубликовать полный ответ на вопрос $ exception.ToString () в своем вопросе?

Редактировать: в соответствии с вашей полной трассировкой стека, строка с ошибкой кода выглядит так:

using (Stream stream = Assembly.
                       GetExecutingAssembly().
                       GetManifestResourceStream("Photo.DAL.Entities.Entities.map"))
{
    //This line is failing with null argument
    mapping = XmlMappingSource.FromStream(stream);
}

Ваш поток ресурсов возвращается в ноль, что либо указывает на то, что ваш ресурс не существует, либо сборка не может быть загружена (иногда это относится к сателлитной сборке). Я подозреваю, что первый сначала ... проверьте, чтобы убедиться, что настройка Build верна в вашем файле .map.

...