簡體   English   中英

從控制台應用程序解析存儲庫時出現Microsoft Unity錯誤-NullReferenceException

[英]Microsoft Unity error when resolving repository from console app - NullReferenceException

從控制台應用程序調用存儲庫時,我在解析存儲庫時遇到問題。 正常運行應用程序(.NET 4,C#,實體框架,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>>();

如果有人可以幫助我了解發生了什么問題,我將非常感謝!

更新:

這是初始化類中的(重要)位:

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做到了嗎?

謝謝,

安妮莉

您可以考慮的一種選擇是創建兩個不同的Initialise類(我猜這是您的Unity bootstrapper類)。

您擁有的一個可以用於您的Web應用程序。

另一個應該不是特定於網絡的。 刪除對HttpContext任何引用(在控制台應用程序中將不可用)和UnityContextLifetimeManager (假定這也是HttpContext特定的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM