autofac - 在非泛型抽象类上注册泛型

时间:2015-02-16 22:16:31

标签: c# autofac

autofac - 在非泛型抽象类

上注册泛型

我有以下类结构..

public class DataContext<TEntityModel> : DataContextBase
        where TEntityModel : IEntity
    {
        public DataContext(string databaseName, string serverName = "localhost") :
            base(databaseName, serverName)
        {
        }
    }


public abstract class Repository<TEntityModel> : IRepository<TEntityModel>
        where TEntityModel : Entity
    {
        protected MongoRepositoryBase(DataContextBase ctx)
        {
            this.DBContext = ctx;
        }
}

public class CustomerRepository : Repository<Customer>
    {
        public CustomerRepository(DataContext<Customer> ctx)
            : base(ctx)
        {
        }
}

我尝试了以下操作,但获得了&#34;类型&#39;存储库2' does not implement the interface 'IRepository 1&#39;。&#34;

builder.RegisterAssemblyTypes(typeof(DataContextBase).Assembly).AsClosedTypesOf(typeof(DataContext<>));

我如何为DataContext进行IoC注册?

1 个答案:

答案 0 :(得分:1)

AsClosedTypesOf方法无法帮助您注册DataContext<>,方法是帮助您注册IRepository<T>

而不是手动注册所有存储库

    builder.RegisterType<CustomerRepository>().As<IRepository<Customer>>();
    builder.RegisterType<InvoiceRepository>().As<IRepository<Invoice>>();
    ...

您可以将所有这些注册一次:

    builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly).AsClosedTypesOf(typeof(IRepository<>)); 

要以通用方式注册DataContext<>,您可以使用RegistrationSource

    public class DataContextRegistrationSource : IRegistrationSource
    {

        public Boolean IsAdapterForIndividualComponents
        {
            get { return true; }
        }

        public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor)
        {
            if (service == null)
            {
                throw new ArgumentNullException("service");
            }
            if (registrationAccessor == null)
            {
                throw new ArgumentNullException("registrationAccessor");
            }

            IServiceWithType ts = service as IServiceWithType;
            if (ts == null || !(ts.ServiceType.IsGenericType && ts.ServiceType.GetGenericTypeDefinition() == typeof(DataContext<>)))
            {
                yield break;
            }

            yield return RegistrationBuilder.ForType(ts.ServiceType)
                                            .AsSelf()
                                            .WithParameter(new NamedParameter("databaseName", "test"))
                                            .WithParameter(new NamedParameter("serverName", "test2"))
                                            .CreateRegistration();

        }
    }

然后

    builder.RegisterSource(new DataContextRegistrationSource());

您现在可以解决IRepository<Customer>

相关问题