Autofac参数从Model转换为Repository

问题描述 投票:0回答:1

如何在Autofac容器注册期间将Model:DatabaseName中的参数设置为MyRepository构造函数?

这是代码示例:

public class ModelBase
{
    public string DatabaseName;
}

public interface IRepository<TEntity>
    where TEntity : ModelBase
{

}

public class MyRepository<TEntity> : IRepository<TEntity>
    where TEntity : ModelBase
{
    private readonly string _connectionString;
    public MyRepository(string databaseName)
    {
        _connectionString = string.Format("DatabaseName='{0}';...", databaseName);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var containerBuilder = new ContainerBuilder();
        containerBuilder.RegisterGeneric(typeof(MyRepository<>)).As(typeof(IRepository<>));

        IContainer container = containerBuilder.Build();
        var someRepository = container.Resolve<IRepository<ModelBase>>();
    }
}
autofac
1个回答
1
投票

据我所知,您可以尝试使用有点代码从存储库的泛型参数中提取DatabaseName的值:

public class ModelBase
{
    public virtual string DatabaseName { get; } = "MyDataBase";
}

public class SubModelBase : ModelBase
{
    public override string DatabaseName { get; } = "AnotherDataBase";
}

public interface IRepository<TEntity>
    where TEntity : ModelBase
{

}

public class MyRepository<TEntity> : IRepository<TEntity>
    where TEntity : ModelBase
{
    private readonly string _connectionString;
    public MyRepository(string databaseName)
    {
        _connectionString = string.Format("DatabaseName='{0}';...", databaseName);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var containerBuilder = new ContainerBuilder();
        containerBuilder.RegisterGeneric(typeof(MyRepository<>)).As(typeof(IRepository<>)).WithParameter((p, ctx) => true, (p, ctx) =>
        {
            var repType = p.Member.DeclaringType;
            var genericParamType = repType.GenericTypeArguments[0];
            var prop = genericParamType.GetProperty("DatabaseName");
            var databaseName = prop.GetValue(Activator.CreateInstance(genericParamType));
            // or for static DatabaseName
            // var databaseName = prop.GetValue(null);
            return databaseName;
        });

        IContainer container = containerBuilder.Build();
        var someRepository = container.Resolve<IRepository<ModelBase>>();
        var anotherRepository = container.Resolve<IRepository<SubModelBase>>();
    }
}

请注意,必须为默认的DatabaseName实例确定ModelBase,并且type必须具有无参数构造函数。或者你可以使DatabaseName静态并使它在编译时分配它。在这种情况下,您可以调用var databaseName = prop.GetValue(null);

© www.soinside.com 2019 - 2024. All rights reserved.