我最近一直在使用dapper,总而言之,除了使用表变量之外,它没有任何问题。
为了进行演示,我使用了此线程中的修改示例。
这段代码运行没有问题:
int tally = connection.Execute(
"create table #t(Name nvarchar(max), Age int)\n" +
"insert #t (Name,Age) values(@Name, @Age)", new[]
{
new {Age = 1, Name = "sam"},
new {Age = 2, Name = "bob"}
});
Run Code Online (Sandbox Code Playgroud)
但这并没有:
int tally = connection.Execute(
"create table @t(Name nvarchar(max), Age int)\n" +
"insert @t (Name,Age) values(@Name, @Age)", new[]
{
new {Age = 1, Name = "sam"},
new {Age = 2, Name = "bob"}
});
Run Code Online (Sandbox Code Playgroud)
唯一的变化是使用表变量而不是临时表 ( @ instead #)。Dapper(或链中的其他任何东西?)似乎以某种方式将其与参数混合并返回“必须声明表变量@t …
我似乎无法在 Autofac 中解决这种情况:
所以我试图为 IFinal 创建一个工厂,但我似乎无法得到正确的解决方案。
示例代码:
public static void Main(string[] args)
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<Dependency>().As<IDependency>();
builder.RegisterType<Final>().As<IFinal>();
// this fails because context c is not available at the time finalObjectFactoryMethod is used
builder.Register<Factory>((c,p)=>{
var dependency = c.Resolve<IDependency>();
Func<int, IFinal> finalObjectFactoryMethod =
rta => c.Resolve<IFinal>(
new TypedParameter(typeof(IDependency), dependency),
new TypedParameter(typeof(int), rta)
);
return new Factory(finalObjectFactoryMethod);
}).As<IFactory>();
// this works but doesn't use …Run Code Online (Sandbox Code Playgroud)