仅从指定的命名空间解决依赖关系
Resolve dependencies only from specified namespace
我可以用这个语句自动注册所有实现接口的类型
IUnityContainer container = new UnityContainer();
container.RegisterTypes(
AllClasses.FromAssembliesInBasePath(),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.Transient);
ICustomer result = container.Resolve<ICustomer>();
如何为接口和实现指定命名空间?
即:只有 Framework.RepositoryInterfaces
中的接口应该由 Framework.RepositoryImplementations
中的类型解析。
尝试按命名空间过滤类型
IUnityContainer container = new UnityContainer();
container.RegisterTypes(
AllClasses.FromAssembliesInBasePath().Where(
t => t.Namespace.StartsWith("Framework.RepositoryImplementations") ||
t.Namespace.StartsWith("Framework.RepositoryInterfaces")),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.Transient);
ICustomer result = container.Resolve<ICustomer>();
您可以使用 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>();
我可以用这个语句自动注册所有实现接口的类型
IUnityContainer container = new UnityContainer();
container.RegisterTypes(
AllClasses.FromAssembliesInBasePath(),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.Transient);
ICustomer result = container.Resolve<ICustomer>();
如何为接口和实现指定命名空间?
即:只有 Framework.RepositoryInterfaces
中的接口应该由 Framework.RepositoryImplementations
中的类型解析。
尝试按命名空间过滤类型
IUnityContainer container = new UnityContainer();
container.RegisterTypes(
AllClasses.FromAssembliesInBasePath().Where(
t => t.Namespace.StartsWith("Framework.RepositoryImplementations") ||
t.Namespace.StartsWith("Framework.RepositoryInterfaces")),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.Transient);
ICustomer result = container.Resolve<ICustomer>();
您可以使用 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>();