繁体   English   中英

温莎城堡综合注册类型

[英]Castle Windsor Complex Registration for Opened generic types

我有2个用于数据处理的类:

public class SqlDataProvider<T> : IDataProvider<T> where T : IEntity
public class MongoDataProvider<T> : IDataProvider<T> where T : IEntity

我有很多这样的模型:

public class Account : ISqlDbEntity
public class Log : IMongoDbEntity

这些接口:

public interface IMongoDbEntity : IEntity
public interface ISqlDbEntity : IEntity

我应该如何注册或可以将Windsor容器注册为泛型,但是MondoDbEntity与MongoDbProvider结合使用,而MsSQl模型与SqlDataProvider结合使用。

    container.Register(Component.For(typeof(IDataProvider<>))
        .ImplementedBy(typeof(SqlDataProvider<>))
        .LifestylePerWebRequest()); //I want this work only with ISqlEntity

   container.Register(Component.For(typeof(IDataProvider<>))
        .ImplementedBy(typeof(MongoDataProvider<>))
        .LifestylePerWebRequest()); //I want this work only with IMongoDbEntity

我已经尝试了这些,但是没有用:

container.Register(Component.For(typeof(IDataProvider<ISqlDbEntity>))
                .ImplementedBy(typeof(SqlDataProvider<>))
                .LifestylePerWebRequest());

            container.Register(Component.For(typeof(IDataProvider<IMongoDbEntity>))
                .ImplementedBy(typeof(MongoDataProvider<>))
                .DependsOn(Dependency.OnAppSettingsValue("databaseName", "MongoDatabaseName"))
                .LifestylePerWebRequest());

提前谢谢!

如果每个提供者仅使用一种类型的实体,那么为什么不在提供者类型注册中使用独特的实体接口呢?

container.Register(Component.For(typeof(IDataProvider<ISqlDbEntity>))
    .ImplementedBy(typeof(SqlDataProvider<>))
    .LifestylePerWebRequest()); 

您可以向多个接口注册,例如:

container.Register(Component.For(typeof(IDataProvider<>),ISqlDbEntity))
        .ImplementedBy(typeof(SqlDataProvider<>))
        .LifestylePerWebRequest());


container.Register(Component.For(typeof(IDataProvider<>),IMongoDbEntity))
    .ImplementedBy(typeof(MongoDataProvider<>))
    .LifestylePerWebRequest()); 

正如您已经做的那样,只需注册两个实例。

container.Register(Component.For(typeof(IDataProvider<ISqlDbEntity>))
                .ImplementedBy(typeof(SqlDataProvider<>))
                .LifestylePerWebRequest());

            container.Register(Component.For(typeof(IDataProvider<IMongoDbEntity>))
                .ImplementedBy(typeof(MongoDataProvider<>))
                .DependsOn(Dependency.OnAppSettingsValue("databaseName", "MongoDatabaseName"))
                .LifestylePerWebRequest());

然后,在使用此接口的具体类中,您可以指定要使用的实现。

https://github.com/castleproject/Windsor/blob/master/docs/inline-dependencies.md根据文档:

container.Register(
    Component.For<ITransactionProcessingEngine>().ImplementedBy<TransactionProcessingEngine>()
        .DependsOn(Dependency.OnComponent<ILogger, SecureLogger>())
);

或者,您可以命名实现并使用此语法。

container.Register(
    Component.For<ITransactionProcessingEngine>().ImplementedBy<TransactionProcessingEngine>()
        .DependsOn(Dependency.OnComponent(typeof(ILogger), "secureLogger"))
);

此工厂方法非常完美!

        container.Register(Component.For(typeof(IDataProvider<>))
            .Forward(typeof(IReadOnlyDataProvider<>))
            .UsingFactoryMethod((kernel, model, creationContext) =>
            {
                var type = creationContext.GenericArguments.First();
                if (type.GetInterface("ISqlDbEntity") != null)
                {
                    var sqlProvider = typeof(SqlDataProvider<>);
                    return Activator.CreateInstance(sqlProvider.MakeGenericType(type), kernel.Resolve<DbContext>());
                }

                var mongoProvider = typeof(MongoDataProvider<>);
                return Activator.CreateInstance(mongoProvider.MakeGenericType(type), kernel.Resolve<MongoClientSettings>(), ConfigurationManager.AppSettings["MongoDatabaseName"]);
            })
            .IsDefault()
            .LifestylePerWebRequest());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM