2009-01-20 48 views
1

我正在一个项目中有两个主要部分:一个类库程序集和主应用程序。两者都使用Castle Windsor进行IoC,并且都在代码中手动设置组件列表(以帮助重构并防止需要配置文件)。目前主要应用有这样的代码:图书馆大会IoC设置

public static void Main() 
{   
    // Perform library IoC setup 
    LibraryComponent.Init(); 

    // Perform application IoC setup 
    IoC.Register<IXyz, Abc>("abc"); 
    // etc, etc, ... 

    // Start the application code ... 
} 

但是初始化库中的呼叫似乎并不像一个很好的解决方案。建立一个使用IoC容器来解耦其内部组件的类库的最佳方法是什么?



编辑:

  • Lusid使用库中的每个公共组件,将依次进行调用初始化一个静态方法建议。一种可能的方法是使用类似PostSharp这样的面向方面的方法做到这一点。但我希望的东西有点更优雅;-)

  • Lusid使用AppDomain.AssemblyLoad事件在加载时进行自定义的步骤还提出,但我的方式,以避免需要任何设置代码,客户端安装后真。


谢谢!

回答

1

我不确定我是否完全理解您正在尝试解决的问题,但我的第一个猜测是您正在寻找一种方法来解耦从主应用程序调用Init方法的需求。我已经在过去使用

一种方法是在类库上的静态类的静态构造函数:

static public class LibraryComponent { 
    static LibraryComponent() { 
    Init(); 
    } 
} 

如果您有多个类库,想评价一个快速和肮脏的方式所有的人,因为他们被加载,这里的(有点毛毛)方式:

[STAThread] 
static void Main() 
{ 
    AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(CurrentDomain_AssemblyLoad); 
} 

static void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args) 
{ 
    IEnumerable<Type> types = args.LoadedAssembly.GetTypes() 
     .Where(t => typeof(IMyModuleInterface).IsAssignableFrom(t)); 
    foreach (Type t in types) 
    { 
     doSomethingWithType(t); 
    } 
} 

WHERE子句可以是任何你想要的,当然。上面的代码可以找到任何派生自每个程序集中的IMyModuleInterface的类,它们被加载到当前的AppDomain中,然后我可以对它进行一些操作,无论是注册依赖项还是维护内部列表。

可能不是你正在寻找的,但希望它有助于某种方式。

+0

这是我试图解决的问题。尽管我想避免使用静态方法,因为它们必须继续使用每个库组件。 – 2009-01-20 05:12:12

0

你可以有一个注册模块。基本上LibraryComponent.Init()函数需要一个IRegistrar来连接所有东西。

IRegistrar基本上可以有一个函数Register(Type interface,Type implementation)。 implmentor会将该函数映射回其IOC容器。

缺点是你不能依赖任何特定于你使用的容器的东西。

0

温莎城堡实际上有一个叫做设施的概念,基本上就是包装标准化配置的方法。在这个模型中,您只需将两个设施添加到容器中,他们就可以完成这项工作。

当然,除非您在配置文件中配置设施(考虑binsor),否则这并不比调用库例程来完成这项工作更好。如果你真的对配置文件过敏,你现在的解决方案可能是最好的。