簡體   English   中英

如何在autofac的RegisterGeneric()方法中使用動態參數?

[英]How do I use dynamic parameters with autofac's RegisterGeneric() method?

現在的情況

我正在用以下模式一對一注冊一些類:

builder.RegisterType<NpgsqlDapperRepository<Foo, int>>()
                .As<IDapperRepository<Foo, int>>()
                .WithParameter(new NamedParameter("connectionString", ConnectionString))
                .WithParameter(new NamedParameter("tableName", "Foos"))
                .WithParameter(new NamedParameter("schema", "dbo"))
                .InstancePerLifetimeScope();

我正在嘗試

我想按如下方式使用RegisterGeneric()

builder.RegisterGeneric(typeof(NpgsqlDapperRepository<,>))
                .As(typeof(IDapperRepository<,>))
                .WithParameter(new NamedParameter("connectionString", ConnectionString))
                .WithParameter(new NamedParameter("tableName", ???)) //TODO: Determine table name from entity type (acquire from dictionary or something). How do I acquire the type?
                .WithParameter(new NamedParameter("schema", "dbo"))
                .InstancePerLifetimeScope();

顯然,這樣一來,我不需要注冊100個實質上具有完全相同配置的實體,只是其中一個參數不同。

問題

我需要從實體類型確定表名稱。 使用RegisterGeneric()時如何獲取類型? 這有可能嗎?

額外注意

我注意到一個叫做ResolvedParameter東西並進行了調查,但是我不確定這是否是我所需要的。 我沒想 但是,如果確實是我所需要的,我將為我的情況提供一個例子。

您可以創建自己的Parameter

public class TableNameParameter : Parameter
{
    public override Boolean CanSupplyValue(
        ParameterInfo pi, IComponentContext context, out Func<Object> valueProvider)
    {
        valueProvider = null;

        if (pi.ParameterType != typeof(String) && pi.Name != "tableName")
            return false;

        valueProvider = () =>
        {
            ITableNameResolver tableNameResolver = context.Resolve<ITableNameResolver>();
            Type entityType = pi.Member.DeclaringType.GetGenericArguments()[0];
            String tableName = tableNameResolver.GetTableName(entityType);
            return tableName;
        };
        return true;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM