2011-10-12 4 views
0

인터페이스의 모든 유형을로드하여 메소드를 호출 할 수 있습니다. 그러나 어셈블리는 컴파일 타임을 참조하지 않습니다. 그들은 bin 폴더에있을 것입니다.Unity가로드되지 않은 어셈블리에 유형을 어떻게 등록합니까?

Unity와 함께 할 수있는 일인가요? 어셈블리 그냥 bin 폴더 삭제 되었기 때문에 물론

using (var container = new UnityContainer()) 
     { 
      container.RegisterType<IModule>(); 

      var modules = container.ResolveAll(typeof(IModule)); 

      foreach (IModule module in modules) { module.Logon(); } 

      Console.WriteLine("Done..."); 
      Console.ReadLine(); 
     } 

이 모듈은 아무것도 해결 :

그래서 예를 들어 내가 좋아하는의 코드 종류가 있습니다. 현재 어셈블리에서 정적으로 참조되지 않습니다.

또는 일부 유형의 Assemblies.LoadAssembly()를 수행해야합니까? 나는 이것을 가능한 한 역동적으로하고 싶습니다. 가능한 경우 구성 파일이나 코드에 어셈블리 이름을 지정하지 않아도됩니다.

미리 감사드립니다.

답변

3

유니티 자체가 어셈블리를로드하지 않습니다. Type 객체를 사용하여 CLR이 원하는대로 해당 유형을로드 할 수 있도록합니다.

원하는대로 동적 검색을 수행하려면 bin 디렉토리의 어셈블리를 회전하고 메모리에로드 한 다음 관심있는 유형을 찾는 회전식 코드를 작성해야합니다 리플렉션 API에 익숙하다면 아주 간단합니다.

여기가로드 확실 모든 어셈블리를 bin 디렉토리를 통해 루프를 사용하여 만들 수있는 몇 가지 코드입니다 :

private static bool ForceLoadAssemblies() 
    { 
     foreach (var fileName in Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll")) 
     { 
      string assemblyName = Path.GetFileNameWithoutExtension(fileName); 
      if (assemblyName != null) 
      { 
       Assembly.Load(assemblyName); 
      } 
     } 
     return true; 
    } 

또 다른 옵션은 대신 MEF보고하는 것입니다. MEF는 동적 검색의 경우를 위해 명시 적으로 설계되었지만 Unity는 내부 종속성 관리를 기반으로 구축되었습니다.

+0

Chris ... 예, 이미 위와 같은 작업을 수행했지만 생각보다 훨씬 효율적으로 통합 작업을 수행 할 수 있습니다. 나는 MEF를 볼 것이다. – PilotBob