我可以自动注册实现与此语句接口的所有类型
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>();