Ошибка Microsoft Unity при разрешении хранилища из консольного приложения - NullReferenceException - PullRequest
1 голос
/ 24 ноября 2011

У меня проблемы с разрешением хранилища при вызове из консольного приложения. Все работает нормально при запуске приложения (.NET 4, C #, Entity Framework, Unity) как обычно, но я создал отдельное консольное приложение, которое будет запускаться из планировщика задач для импорта каналов. Я очень близок к тому, чтобы сдаться и заняться грязным взломом и написать скрипт для вызова веб-страницы вместо использования консольного приложения, но я подумал, что по крайней мере попытаюсь понять, почему оно не работает в первую очередь.

Я новичок в Entity Framework и Unity, поэтому, пожалуйста, потерпите меня и дайте мне знать, если я пропустил какую-либо важную информацию.

Это ошибка, которую я получаю:

Resolution of the dependency failed, type = "MyNamespace.Domain.Template.IRepository`2[MyNamespace.Domain.Employees.OrganisationalUnit,System.Guid]", name = "(none)".
Exception occurred while: while resolving.
Exception is: NullReferenceException - Object reference not set to an instance of an object.

at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides)
at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides)
at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve[T](IUnityContainer container, ResolverOverride[] overrides)
at MyNamespace.Infrastructure.FeedDefinition.GetOrganisationalUnit(String name, OrganisationalUnit parent) in C:\FeedDefinition.cs:line 552

Это код консольного приложения:

static void Main(string[] args)
{
    if (args.Length > 0)
    {
        MyNamespace.Appliance.Configuration.Initialise.InitialiseContainer();

        ImportFeedProcessor importFeedProcessor = new ImportFeedProcessor();

        importFeedProcessor.Run(args[0]);
    }
}

И вот где это терпит неудачу:

IRepository<OrganisationalUnit, Guid> organisationalUnitRepository = 
    Context.Instance.Container.Resolve<IRepository<OrganisationalUnit, Guid>>();

Если кто-нибудь может помочь мне понять, что происходит не так, я был бы очень благодарен!

UPDATE:

Вот (важные) биты из класса инициализации:

public static void InitialiseContainer()
{
    UnityContainer container = new UnityContainer();

    // Use HttpContext for registering instances against for live
    IContext context = HttpContextWrapper.Instance;

    // Register the HttpContext as the default context to use
    container.RegisterInstance<IContext>(HttpContextWrapper.Instance);

    // repositories
    container.RegisterType<IRepository<Employee, Guid>, EmployeeRepository>(
        new UnityContextLifetimeManager(context),
                new InjectionConstructor(true, "OrganisationalUnit.Parent.Parent"));
    container.RegisterType<IRepository<OrganisationalUnit, Guid>, EntityFrameworkRepository<OrganisationalUnit, Guid>>(
                new UnityContextLifetimeManager(context),
                new InjectionConstructor("Parent.Parent"));

    // Create and populate a new Unity container from configuration
    Context.Instance.Container = container;
}

Возможно, это делает HttpContext?

Спасибо

Annelie

1 Ответ

1 голос
/ 24 ноября 2011

Один вариант, который вы могли бы рассмотреть, - это создание двух разных классов Initialise (полагаю, это ваш класс загрузчика Unity).

Тот, который у вас есть, может быть использован для вашего веб-приложения.

Другой должен быть не специфичным для сети. Удалите любую ссылку на HttpContext (она не будет доступна в консольном приложении) и UnityContextLifetimeManager (при условии, что это также HttpContext).

...