gpt4 book ai didi

generics - StructureMap 2.6.1,一个 IRepository 和一个 EFRepository

转载 作者:行者123 更新时间:2023-12-02 13:13:03 25 4
gpt4 key购买 nike

所以我想我应该狡猾地尝试一下这个。我需要传递上下文,而不需要每次都更新它,并且能够定义映射( Entity Framework )——为了做到这一点,我需要继承然后重写 DbContext 类。我想让它能够与我放入的任何上下文兼容,这就是我这样做的原因。我有一个 IRepository 接口(interface),它采用一个(实体),其中包含您通常怀疑的内容,以及它的实现依赖于 IContextFactory ...

public interface IContextFactory<T> where T : DbContext
{
T Context { get; }
}

在我的“EFRepository”上

public class EFRepository<T, TContext> : IRepository<T> where T : class
where TContext : DbContext
{

public EFRepository(IContextFactory<TContext> contextFactory)
{
}
}

在我的 map 中,我做了以下工作之一......

        x.For(typeof(IContextFactory<>)).Use(typeof(ContextFactory<>));
x.For(typeof(IRepository<>)).Use(typeof(EFRepository<,>));

好吧,酷。在我的单元测试中,我尝试这样做......

        var repository = ObjectFactory.GetInstance<EFRepository<Currency, EFContext>>();
var repository2 = ObjectFactory.GetInstance<IRepository<Currency>>();

第一个有效,没问题。第二个,我被击中

提供的泛型参数数量不等于泛型类型定义的数量。参数名称:实例化

我猜这是因为我没有告诉结构映射将哪个泛型传递给 IRepository,因为我传递了 2?我怎么做? ...我可以这样做吗?

最佳答案

这应该是可能的,但它真的很困惑......除非有人知道更好的方法。

首先您需要更改创建 EFRepository<,> 的方式。使用.Use(context => ...)重载你可以访问像context.BuildStack.Current.RequestedType.GetGenericArguments()这样的上下文获取您想要访问的泛型类型。然后你可以新建 EFRepository<,> 的新实例使用反射并获取IContextFactory从上下文来看。

所以无论如何,类似

            ObjectFactory.Configure(x =>
{
x.For(typeof(IContextFactory<>)).Use(typeof(ContextFactory<>));
x.For(typeof (IRepository<>)).Use(context =>
{
Type arg1 = context.BuildStack.Current.RequestedType.
GetGenericArguments()[0];

Type targetType =
typeof (EfRepository<,>).MakeGenericType(new[] {arg1, typeof (IContextFactory<>)});

return Activator.CreateInstance(targetType,
new[] {context.GetInstance(typeof (IContextFactory<>))});

});
//x.For(typeof(IRepository<>)).Use(typeof(EfRepository<,>));
});

var repository = ObjectFactory.GetInstance<EfRepository<Currency, EfContext>>();
var repository2 = ObjectFactory.GetInstance<IRepository<Currency>>();

将帮助您完成大部分任务。我认为您仍然需要正确设置 targetType 的第二个泛型参数的泛型,然后它才能工作。

关于generics - StructureMap 2.6.1,一个 IRepository<T> 和一个 EFRepository<T,TContext>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5943454/

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