开放泛型类型的 Castle Windsor Complex 注册
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<>),IMongoDbEntity))
.ImplementedBy(typeof(MongoDataProvider<>))
.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<>))
.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());
我有 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<>),IMongoDbEntity))
.ImplementedBy(typeof(MongoDataProvider<>))
.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<>))
.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());