加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 仅从指定的命名空间解析依赖关系

发布时间:2020-12-15 06:36:57 所属栏目:百科 来源:网络整理
导读:我可以自动注册实现与此语句接口的所有类型 IUnityContainer container = new UnityContainer();container.RegisterTypes( AllClasses.FromAssembliesInBasePath(),WithMappings.FromMatchingInterface,WithName.Default,WithLifetime.Transient);ICustomer
我可以自动注册实现与此语句接口的所有类型
IUnityContainer container = new UnityContainer();

container.RegisterTypes(
    AllClasses.FromAssembliesInBasePath(),WithMappings.FromMatchingInterface,WithName.Default,WithLifetime.Transient);
ICustomer result = container.Resolve<ICustomer>();

如何为接口和实现指定命名空间?

即:Framework.RepositoryInterfaces中的接口只能通过Framework.RepositoryImplementations中的类型解析.

解决方法

您可以使用 RegistrationConvention:
public class NamespaceRegistrationConvention : RegistrationConvention
{
    private readonly IEnumerable<Type> _typesToResolve;
    private readonly string _namespacePrefixForInterfaces;
    private readonly string _namespacePrefixForImplementations;

    public NamespaceRegistrationConvention(IEnumerable<Type> typesToResolve,string namespacePrefixForInterfaces,string namespacePrefixForImplementations)
    {
        _typesToResolve = typesToResolve;
        _namespacePrefixForInterfaces = namespacePrefixForInterfaces;
        _namespacePrefixForImplementations = namespacePrefixForImplementations;
    }

    public override IEnumerable<Type> GetTypes()
    {
        // Added the abstract as well. You can filter only interfaces if you wish.
        return _typesToResolve.Where(t =>
            ((t.IsInterface || t.IsAbstract) && t.Namespace.StartsWith(_namespacePrefixForInterfaces)) ||
            (!t.IsInterface && !t.IsAbstract && t.Namespace.StartsWith(_namespacePrefixForImplementations)));
    }

    public override Func<Type,IEnumerable<Type>> GetFromTypes()
    {
        return WithMappings.FromMatchingInterface;
    }

    public override Func<Type,string> GetName()
    {
        return WithName.Default;
    }

    public override Func<Type,LifetimeManager> GetLifetimeManager()
    {
        return WithLifetime.Transient;
    }

    public override Func<Type,IEnumerable<InjectionMember>> GetInjectionMembers()
    {
        return null;
    }
}

并通过以下方式使用:

container.RegisterTypes(new NamespaceRegistrationConvention(AllClasses.FromAssembliesInBasePath(),"Framework.RepositoryInterfaces","Framework.RepositoryImplementations");
ICustomer result = container.Resolve<ICustomer>();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读