2009-09-17 113 views
2

我正在使用Unity DI容器。在配置文件我指定以下类型:Unity容器配置问题

<type type="Interfaces.ILogger,Interfaces" 
mapTo = "ConcreateClasses.ConsoleLogger,ConcreateClasses" /> 

我的理解是,无论是接口的dll和ConcreteClasses DLL应该在我的项目中引用为了这个工作。

但我想要做的不是在设计时引用具体的实现类。我希望它们在运行时通过指定ConcreteClasses dll的路径加载。

有没有办法做到这一点?

感谢

回答

1

你可以通过反射做:

Assembly a = Assembly.LoadFrom("pathToDll"); 
Type interfaceType = typeof(Interfaces.ILogger); 
Type implementingType = a.GetTypes.Where(t => t.IsAssignableTo(interfaceType)).First(); //add any other constraints to decide mapping 

container.RegisterType(interfaceType, implementingType); 
+0

感谢您的回答。那么没有办法通过配置文件来做到这一点? – rauts 2009-09-17 15:27:13

3

你并不需要参考的具体实施装配在你的项目,你只需要有它在同一个文件夹作为配置文件,或可从GAC获得。

这是便利引用带有具体实现的其他程序集,以便Visual Studio将在您的项目的结果BIN文件夹中放置一个DLL的副本,从而使查找琐碎。

+0

我很抱歉,具体的实现程序集可以是参考或GAC中的。将它放在与配置文件相同的文件夹中不起作用。无论如何感谢您的答案 – rauts 2009-09-17 16:21:21

+0

我现在有一个相当大的实现坐在EC2上,没有对具体对象的引用,并且我的所有对象都在Unity配置部分中按类型引用。 我不知道你有什么问题,但这个配置适合我。 – 2009-09-17 16:35:49

+0

这很有趣。你是否将所有的配置文件和Dll部署在同一个文件夹中,因为那是我现在正在做的事情,而且它不工作。您能否与我分享您的部署策略? – rauts 2009-09-18 10:28:41