在Autofac中,您可以使用RegisterAssemblyTypes注册依赖项
所以你可以做这样的事情,有没有办法在.net Core
builder.RegisterAssemblyTypes(Assembly.Load("SomeProject.Data"))
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
的{{1}}版本中做类似的事情
public class LeadService : ILeadService
{
private readonly ILeadTransDetailRepository _leadTransDetailRepository;
public LeadService(ILeadTransDetailRepository leadTransDetailRepository)
{
_leadTransDetailRepository = leadTransDetailRepository;
}
}
这就是我要注册的内容
LeadService.cs
public class LeadTransDetailRepository : RepositoryBase<LeadTransDetail>,
ILeadTransDetailRepository
{
public LeadTransDetailRepository(IDatabaseFactory databaseFactory)
: base(databaseFactory) { }
}
public interface ILeadTransDetailRepository : IRepository<LeadTransDetail> { }
LeadTransDetailRepository.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddTransient<ILeadService, LeadService>();
//not sure how to register the repositories
services.Add(new ServiceDescriptor(typeof(ILeadTransDetailRepository),
typeof(IRepository<>), ServiceLifetime.Transient));
services.Add(new ServiceDescriptor(typeof(IDatabaseFactory),
typeof(DatabaseFactory), ServiceLifetime.Transient));
services.AddTransient<DbContext>(_ => new DataContext(
this.Configuration["Data:DefaultConnection:ConnectionString"]));
}
这就是我如何尝试Regisyer,但我无法弄清楚如何注册存储库 的 Startup.cs
{{1}}
答案 0 :(得分:4)
使用ASP.NET核心依赖注入/ IoC容器没有开箱即用的方法,但它的设计&#34;。
ASP.NET IoC Container / DI旨在成为添加DI功能的简单方法,并作为构建到ASP.NET Core应用程序中的其他IoC Container框架的基础。
据说它支持简单的场景(注册,尝试使用第一个构造函数,其中大多数参数都满足依赖关系和作用域依赖关系),但它缺少自动注册或装饰器支持等高级场景。
对于此功能,您必须使用第三方库和/或第三方IoC容器(AutoFac,StructureMap等)。它们仍然可以插入xquery version "1.0-ml";
declare namespace xs = "http://www.w3.org/2001/XMLSchema";
let $value1 := "antony"
let $value2 := "cse"
let $value3 := "year"
let $value4 := "2010"
let $value5 := "volume"
let $value6 := "2"
let $value7 := "part"
let $value8 := "1"
for $uri1 in cts:uris((),(), (
cts:element-query(xs:QName("P"),
cts:and-query(
(
cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value1) ,
cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value2),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value3),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value4),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value5),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value6),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value7),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value8)
))
)) )
return doc($uri1)
您以前的注册仍然有效,但您可以获得其他功能。
答案 1 :(得分:1)
我认为您可以通过手动扫描注册所有服务。然后将它们注册到Service集合。这是我的示例代码(.Net core 2.0)
public static void ResolveAllTypes(this IServiceCollection services, string solutionPrefix, params string[] projectSuffixes)
{
//solutionPrefix is my Solution name, to separate with another assemblies of Microsoft,...
//projectSuffixes is my project what i want to scan and register
//Note: To use this code u must reference your project to "projectSuffixes" projects.
var allAssemblies = new List<Assembly>();
var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
foreach (var dll in Directory.GetFiles(path, "*.dll"))
allAssemblies.Add(Assembly.LoadFile(dll));
var types = new List<Type>();
foreach (var assembly in allAssemblies)
{
if (assembly.FullName.StartsWith(solutionPrefix))
{
foreach (var assemblyDefinedType in assembly.DefinedTypes)
{
if (projectSuffixes.Any(x => assemblyDefinedType.Name.EndsWith(x)))
{
types.Add(assemblyDefinedType.AsType());
}
}
}
}
var implementTypes = types.Where(x => x.IsClass).ToList();
foreach (var implementType in implementTypes)
{
//I default "AService" always implement "IAService", You can custom it
var interfaceType = implementType.GetInterface("I" + implementType.Name);
if (interfaceType != null)
{
services.Add(new ServiceDescriptor(interfaceType, implementType,
ServiceLifetime.Scoped));
}
}
}
答案 2 :(得分:1)
我还想尝试内置,对缺少自动注册感到恼火,并为此构建了一个开源项目,看看:
https://github.com/SharpTools/SharpDiAutoRegister
只需添加nuget包SharpDiAutoRegister
并在ConfigureServices方法中添加您的约定:
services.ForInterfacesMatching("^I[a-zA-z]+Repository$")
.OfAssemblies(Assembly.GetExecutingAssembly())
.AddSingletons();
services.ForInterfacesMatching("^IRepository")
.OfAssemblies(Assembly.GetExecutingAssembly())
.AddTransients();
//and so on...
答案 3 :(得分:0)
ASP.NET Core从头开始设计,以支持和利用依赖注入。
ASP.NET核心应用程序可以通过将内置框架服务注入Startup类中的方法来利用内置框架服务,并且还可以配置应用程序服务以进行注入。
ASP.NET Core提供的默认服务容器提供了一个最小的功能集,并且是
无意替换其他容器。
来源:https://docs.asp.net/en/latest/fundamentals/dependency-injection.html
默认的ASP.NET容器是
简单且不提供强大的配置和性能 其他容器可用的选项。
幸运的是,您可以将默认容器换成一个已经作为NuGet包提供的社区创建的全功能容器。
Autofac (http://autofac.org/)是已经可用于ASP.NET Core的版本,您可以通过引用
将其添加到项目中Autofac和
Autofac.Extensions.DependencyInjection包。
来源:https://blogs.msdn.microsoft.com/webdev/2016/03/28/dependency-injection-in-asp-net-core/