gpt4 book ai didi

entity-framework - 从 AutoFac 解析 IDbSet

转载 作者:行者123 更新时间:2023-12-01 16:18:55 25 4
gpt4 key购买 nike

我想使用 IDbSet<> 实现通用存储库模式 Entity Framework 的接口(interface)。

当我问IDbSet<T>时来自 Autofac,它应该解析 IDbContext然后调用它的Set<T>方法返回 IDbSet<T> 的具体类型

举个例子,它应该做这样的事情:

builder.Register<IDbSet<T>>(context => context.Resolve<IDbContext>().Set<T>());

如何使用 Autofac 实现此目的?

最佳答案

似乎是基于这个答案:https://stackoverflow.com/a/7997162/872395

唯一的解决方案是创建一个自定义的IRegistrationSource,您可以在其中创建关闭的注册:

public class DbSetRegistrationSource : IRegistrationSource
{
public bool IsAdapterForIndividualComponents
{
get { return true; }
}

public IEnumerable<IComponentRegistration> RegistrationsFor(
Service service,
Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor)
{
var swt = service as IServiceWithType;
if (swt == null || !swt.ServiceType.IsGenericType)
yield break;

var def = swt.ServiceType.GetGenericTypeDefinition();
if (def != typeof(IDbSet<>))
yield break;

// if you have one `IDBContext` registeration you don't need the
// foreach over the registrationAccessor(dbContextServices)

yield return RegistrationBuilder.ForDelegate((c, p) =>
{
var dBContext = c.Resolve<IDBContext>();
var m = dBContext.GetType().GetMethod("Set", new Type[] {});
var method =
m.MakeGenericMethod(swt.ServiceType.GetGenericArguments());
return method.Invoke(dBContext, null);
})
.As(service)
.CreateRegistration();
}
}

使用方法非常简单:

var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterSource(new DbSetRegistrationSource());
containerBuilder.RegisterType<DbContext>().As<IDBContext>();
var container = containerBuilder.Build();

关于entity-framework - 从 AutoFac 解析 IDbSet<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16224895/

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