Unity.AutoRegistration可以正常工作,例如TClass
和ITClass
。我希望接口名称不带前缀“T”,如IClass
,并且需要IClass
来匹配TClass
。
但是当我重命名界面时,自动注册失败。我是否必须匹配类型/接口名称,或者是否有办法满足我的需求?
答案 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);