当从控制台应用程序解析存储库时,微软Unity错误- NullReferenceException



我在从控制台应用程序调用存储库时遇到问题。运行应用程序时一切正常。. NET 4, c#,实体框架,Unity),但我创建了一个独立的控制台应用程序,它将从任务调度程序中运行以导入提要。我非常接近放弃,做一个肮脏的hack,写一个脚本来调用网页,而不是使用控制台应用程序,但我想我至少要先试着理解为什么它不能工作。

我对实体框架和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>>();

如果有人能帮助我了解出了什么问题,我将非常感激!

更新:

这是(重要的)初始化类:

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

你可以考虑的一个选择是创建两个不同的Initialise类(我猜这是你的Unity bootstrapper类)。

你有一个可以用于你的web应用程序。

另一个应该是非web特定的。删除对HttpContext的任何引用(它将无法在控制台应用程序中使用)和UnityContextLifetimeManager(假设这也是HttpContext特定的)。

最新更新