使用XML或web.config配置Unity容器

时间:2012-09-25 14:16:21

标签: c# asp.net .net asp.net-mvc-3 unity-container

我正在使用.net 4.5和MVC4。 我按照以下帖子中所述实现了Unity IoC:http://kennytordeur.blogspot.com/2011/05/aspnet-mvc-3-and-unity-using.html

但我希望能够注册"我的存储库类型使用外部XML或web.config。这可能吗?,样品将不胜感激。

感谢

1 个答案:

答案 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查询有很多细微的缺陷(例如,它缺乏对泛型类型约束的检查),但它适用于常见的场景。如果你使用泛型类型约束,你肯定应该切换到一个支持这个的框架,因为这是很难做到的。