2017-04-06 55 views
1

林加载试图从一个特定的文件夹,但基本接口加载所有类型时是通用的:IAnalysis温莎城堡和泛型类型从装配

以下语法适用于非泛型类型。 :

container.Register(Classes.FromAssemblyInDirectory(new AssemblyFilter(folder)).BasedOn<IAnalysis>()); 

如何使它与我的泛型类型一起工作?我需要的是这样的.BasedOn<IAnalysis<T>>

感谢

阿米特

回答

1

你可以这样说:

public class MyModuleInstaller : IWindsorInstaller 
{ 
    public static bool IsContructable(this Type t) 
    { 
     return !t.IsAbstract && !t.ContainsGenericParameters; 
    } 

    void IWindsorInstaller.Install(IWindsorContainer container) 
    { 
     IEnumerable<IRegistration> myRegistrations = GetRegistrations(); 
     if (myRegistrations != null) 
     { 
      container.Register(myRegistrations .ToArray()); 
     } 
    } 

    protected virtual IEnumerable<IRegistration> GetRegistrations() 
    { 
     return new IRegistration[] 
     { 
      Classes.FromAssembly(GetAssemblyNamed("TheNameOfMyAssembly")) 
       .BasedOn<IMyInterfaceOrMyGenericBase>() 
       .If(x => Component.IsInNamespace("MyNamespace", true)(x) && x.IsContructable()) 
       .WithServices(new[] {typeof (IMyInterfaceOrMyGenericBase) })) 
      }; 
    } 

    // you can remove this method. Added for your convenience 
    protected virtual Assembly GetAssemblyNamed(string assemblyName) 
    { 
     try 
     { 
      if(Assembly.GetExecutingAssembly().FullName.Split(',')[0] == assemblyName) 
      { 
       return Assembly.GetExecutingAssembly(); 
      } 

      Assembly fromDynamicModuleLoader = MyModuleLoader.MyAssemblies.FirstOrDefault(x => x.GetName().Name == assemblyName); 
      if(fromDynamicModuleLoader != null) 
      { 
       return fromDynamicModuleLoader; 
      } 

      if(_loadedInAppDomain == null) 
      { 
       _loadedInAppDomain = 
        System.AppDomain.CurrentDomain.GetAssemblies() 
         .Where(x => x.FullName.Contains(assemblyName)) 
         .ToArray(); 
      } 

      var fromAppDomain = _loadedInAppDomain.FirstOrDefault(x => x.FullName.Split(',')[0] == assemblyName); 

      if(fromAppDomain != null) 
      { 
       return fromAppDomain; 
      } 

      return ReflectionUtil.GetAssemblyNamed(assemblyName); 
     } 
     catch(FileNotFoundException) 
     { 
      throw; 
     } 
    } 
}