Unity.AutoRegistration - 仅注册具有相同名称的接口和类型

时间:2012-06-20 18:10:06

标签: .net unity-container auto-registration

当类型名称与接口名称匹配时,

Unity.AutoRegistration可以正常工作,例如TClassITClass。我希望接口名称不带前缀“T”,如IClass,并且需要IClass来匹配TClass

但是当我重命名界面时,自动注册失败。我是否必须匹配类型/接口名称,或者是否有办法满足我的需求?

2 个答案:

答案 0 :(得分:1)

在与作者协商后,这是必需的代码:

UContainer
    .ConfigureAutoRegistration()
    .LoadAssemblyFrom(Assembly.GetEntryAssembly().Location)
    .ExcludeSystemAssemblies()
    .Include(If.ImplementsITypeName, Then.Register())
    .Include(
        type => type.GetInterfaces().Any(i => i.Name.StartsWith("I") && i.Name.Substring(1) == type.Name.Substring(1)), Then.Register())
    .Include(If.ImplementsSingleInterface, Then.Register())
    .ApplyAutoRegistration();

答案 1 :(得分:0)

很长一段时间没有触及自动注册的代码。 TecX project on codeplex包含Unity的增强配置引擎,该引擎作为StructureMap配置的端口启动。该引擎还支持注册约定。

其中一个默认约定将类MyService注册为接口IMyService的实现。它看起来很简单:

public class ImplementsIInterfaceNameConvention : IRegistrationConvention
{
  public void Process(Type type, ConfigurationBuilder builder)
  {
    if (!type.IsConcrete())
    {
      return;
    }
    Type pluginType = FindPluginType(type);
    if (pluginType != null && 
        Constructor.HasConstructors(type))
    {
      builder.For(pluginType).Add(type).Named(type.FullName);
    }
  }
  private static Type FindPluginType(Type concreteType)
  {
    string interfaceName = "I" + concreteType.Name;
    Type[] interfaces = concreteType.GetInterfaces();
    return Array.Find(interfaces, t => t.Name == interfaceName);
  }
}

如果您需要一些自定义命名约定,则可以非常轻松地修改上面的示例。使用该约定配置容器将如下所示:

var builder = new ConfigurationBuilder();
builder.Scan(s => 
          {
            s.AssembliesFromApplicationBaseDirectory();
            s.With(new MyCustomConvention());
          });
var container = new UnityContainer();
container.AddExtension(builder);
相关问题