2011-11-24 4 views
1

콘솔 앱에서 저장소를 호출 할 때 문제가 발생합니다. 응용 프로그램 (.NET 4, C#, Entity Framework, Unity)을 정상적으로 실행하면 모든 것이 잘 작동하지만 작업 스케줄러에서 피드를 가져 오기 위해 실행할 독립 실행 형 콘솔 앱을 만들었습니다. 나는 포기하고 더러운 해킹을하고 콘솔 앱을 사용하는 대신 웹 페이지를 호출하는 스크립트를 작성하지만, 적어도 내가 왜 먼저 작동하지 않는지 이해하려고 노력할 것이라고 생각했습니다.콘솔 앱에서 리포지토리를 확인할 때 Microsoft Unity 오류 발생 - NullReferenceException

저는 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 두 개의 서로 다른 Initialise 클래스를 만드는 고려할 수

+0

InitialiseContainer()에 대한 코드를 제공 할 수 있습니까? –

+0

@ John Allers - 초기 코드를 업데이트하겠다. (거대한 함수이므로 줄이자. 그러나 모든 중요한 것들이 있어야한다.) – annelie

답변

1

하나의 옵션은 (내가 그 같은데요하면 유니티 부트 스트 래퍼 클래스입니다).

웹 응용 프로그램에 사용할 수 있습니다.

다른 하나는 웹용이 아니어야합니다. HttpContext (콘솔 앱에서는 사용 가능하지 않음) 및 UnityContextLifetimeManager (해당 사항은 HttpContext으로 가정)을 삭제하십시오.

+0

감사합니다. 잘 작동하는 단위 테스트를위한 초기화 컨테이너가 다르기 때문에 이전에이 사실을 깨달았어야했는데, 여기에 코드를 복사 할 때까지 생각하지 않았습니다. 나는 지금 Linq 오류를 얻고있다. 그러나 적어도 나는 더 가까워진다. 감사합니다! :) – annelie

관련 문제