首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态注册泛型类型

动态注册泛型类型
EN

Stack Overflow用户
提问于 2014-01-11 07:52:37
回答 1查看 1.4K关注 0票数 2

我想使用Unity注册一个通用的Repository类。

这是我的泛型类:

代码语言:javascript
复制
public class Repository<TModel> 
    : IRepository<TModel> where TModel : class, IModel

TModel是与Entity一起使用的POCO对象。

如果我像这样注册它,它就能工作。

代码语言:javascript
复制
IOC_Container.RegisterType(typeof(IRepository<Employee>), typeof(Repository<Employee>));

不过,这需要我注册每个TModel,这会变得很麻烦。

我有一个引导程序,它使用反射动态注册我的服务类,我想对存储库做同样的事情。

以下是服务的引导程序代码:

代码语言:javascript
复制
var currentAssembly = Assembly.LoadFrom(assembly);
var assemblyTypes = currentAssembly.GetTypes();

foreach (var assemblyType in assemblyTypes)
{
    if (assemblyType.IsInterface)
    {
        continue;
    }

    if (assemblyType.FullName.EndsWith("Service"))
    {
        foreach (var requiredInterface in assemblyType.GetInterfaces())
        {
            if (requiredInterface.FullName.EndsWith("Service"))
            {
                var typeFrom = assemblyType.GetInterface(requiredInterface.Name);
                var typeTo = assemblyType;
                IOC_Container.RegisterType(typeFrom, typeTo);
            }
        }
    }
}

}

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2014-01-14 04:01:37

Unity 3支持registration by convention。按照约定使用注册,您的示例可能如下所示:

代码语言:javascript
复制
var currentAssembly = Assembly.LoadFrom(assembly);

IOC_Container.RegisterTypes(
    currentAssembly.GetTypes().Where(
      t => t.FullName.EndsWith("Service"),
    WithMappings.MatchingInterface,
    WithName.Default);

上面的代码将为匹配的Repository<Employee>具体类型注册一个IRepository<Employee>接口。

当注册多个类型时,这可以使工作变得更容易,但对于您发布的特定存储库代码,您可能不需要该功能。Unity允许您注册开放泛型类型,因此您可以只执行一次注册,而不是注册IRepository的所有组合:

代码语言:javascript
复制
IOC_Container.RegisterType(
    typeof(IRepository<>), typeof(Repository<>));
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21056628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档