gpt4 book ai didi

StructureMap 自动注册后代类

转载 作者:行者123 更新时间:2023-12-04 07:04:22 25 4
gpt4 key购买 nike

我有一个 Repository 的基类。在一个特定的项目中,我有几个这个基类的实现。例如

PersonRepository : Repository<T>
EmployerRepository : Repository<T>

现在,我正在 StructureMap ServiceRegistry 类中注册这些存储库中的每一个。像这样:
ForRequestedType<Repository<Person>>()
.TheDefaultIsConcreteType<PersonRepository>();
ForRequestedType<Repository<Employer>>()
.TheDefaultIsConcreteType<EmployerRepository>();

这很糟糕,因为每次添加存储库时,我都必须记住注册它。又是一步。

有没有办法可以搜索 PersonRepository 所在的项目/程序集并注册从 Repository 继承的所有内容?

最佳答案

编辑 :我刚刚从 project's CI server 下载了最新版本的 StructureMap .
您现在需要的内容已包含在内,无需使用自定义约定:

public class RepositoryRegistry : Registry
{
public RepositoryRegistry()
{
Scan(assemblyScanner =>
{
assemblyScanner.AssemblyContainingType<PersonRepository>();
assemblyScanner.AddAllTypesOf(typeof (IRepository<>));
assemblyScanner.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
});
}
}

这是我最初的解决方案:

这是一个很好的起点,但可能需要改进:
public class RepositoryRegistry : Registry
{
public RepositoryRegistry()
{
Scan(assemblyScanner =>
{
assemblyScanner.AssemblyContainingType<PersonRepository>();
assemblyScanner.AddAllTypesOf(typeof (IRepository<>));
assemblyScanner.With<RepositoryConvention>();
});
}
}

public class RepositoryConvention : ITypeScanner
{
public void Process(Type type, PluginGraph graph)
{
var selectedInterface =
(from @interface in type.GetInterfaces()
where @interface.IsGenericType &&
@interface.GetGenericTypeDefinition()
.IsAssignableFrom(typeof (IRepository<>))
select @interface).SingleOrDefault();

if(selectedInterface != null)
graph.Configure(registry =>
registry.ForRequestedType(selectedInterface)
.TheDefaultIsConcreteType(type)
);
}
}

关于StructureMap 自动注册后代类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1356021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com