我正在使用.net 4.5和MVC4。 我按照以下帖子中所述实现了Unity IoC:http://kennytordeur.blogspot.com/2011/05/aspnet-mvc-3-and-unity-using.html
但我希望能够注册"我的存储库类型使用外部XML或web.config。这可能吗?,样品将不胜感激。
感谢
答案 0 :(得分:3)
除非有充分理由,否则您应该尽可能在代码中注册。 XML配置更容易出错,冗长且很快就会成为维护的噩梦。不是在XML中注册(全部)您的存储库类型(可以使用Unity),只需将包含存储库类型的程序集名称放在配置中,并在代码中动态注册它们。这使您无需在每次添加新存储库实现时更改配置。
这是一个例子。
在配置文件中,添加一个新的appSetting,其中包含程序集的名称:
<appSettings>
<add key="RepositoryAssembly" value="AssemblyName" />
</appSettings>
在撰写根目录中,您可以执行以下操作:
var assembly = Assembly.LoadFrom(
ConfigurationManager.AppSettings["RepositoryAssembly"]);
// Unity misses a batch-registration feature, so you'll have to
// do this by hand.
var repositoryRegistrations =
from type in assembly.GetExportedTypes()
where !type.IsAbstract
where !type.IsGenericTypeDefinition
let repositoryInterface = (
from _interface in type.GetInterfaces()
where _interface.IsGenericType
where typeof(IRepository<>).IsAssignable(
_interface.GetGenericTypeDefinition())
select _interface)
.SingleOrDefault()
where repositoryInterface != null
select new
{
service = repositoryInterface,
implemention = type
};
foreach (var reg in repositoryRegistrations)
{
container.RegisterType(reg.service, reg.implementation);
}
LINQ查询有很多细微的缺陷(例如,它缺乏对泛型类型约束的检查),但它适用于常见的场景。如果你使用泛型类型约束,你肯定应该切换到一个支持这个的框架,因为这是很难做到的。