我有问题。我正在实现一个基于Owin和Castle的selfhost web api。我的界面如下所示:
public interface IFluentStoredProcedureRunner<T> where T : class
{
FluentStoredProcedureRunner<T> WithName(string storedProcedureName);
FluentStoredProcedureRunner<T> WithParameters(List<StoredProcedureParameterDefinition> parameterList = null);
StoredProcedureResult<T> Run();
}
,实现如下:
public class FluentStoredProcedureRunner<T> : IFluentStoredProcedureRunner<T> where T : class
{
private readonly IStoredProcedureRunner<T> storedProcedureRunner;
private string storedProcedureName = string.Empty;
private List<StoredProcedureParameterDefinition> parameterList = new List<StoredProcedureParameterDefinition>();
public FluentStoredProcedureRunner(IStoredProcedureRunner<T> storedProcedureRunner)
{
this.storedProcedureRunner = storedProcedureRunner;
}
public FluentStoredProcedureRunner<T> WithName(string storedProcedureName)
{
this.storedProcedureName = storedProcedureName;
return this;
}
public FluentStoredProcedureRunner<T> WithParameters(List<StoredProcedureParameterDefinition> parameterList = null)
{
this.parameterList = parameterList;
return this;
}
public StoredProcedureResult<T> Run()
{
return this.storedProcedureRunner.Run(this.storedProcedureName, this.parameterList);
}
}
和注册:
public class CoreLibInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For(typeof(IMapper<>))
.ImplementedBy(typeof(MapByFieldNameMapper<>))
.LifestyleTransient());
container.Register(
Component.For(typeof(IStoredProcedureRunner<>))
.ImplementedBy(typeof(StoredProcedureRunner<>))
.LifestyleTransient());
container.Register(
Component.For(typeof(IFluentStoredProcedureRunner<>))
.ImplementedBy(typeof(FluentStoredProcedureRunner<>))
.LifestyleTransient());
container.Register(
Component.For<IAuthenticationService>()
.ImplementedBy<ActiveDirectoryAuthenticationService>()
.LifestyleTransient());
container.Register(
Component.For<IStoredProcedureNameResolverService>()
.ImplementedBy<StoredProcedureNameResolverService>()
.LifestyleTransient());
}
}
这是存储过程运行器:
public class StoredProcedureRunner<T> : IStoredProcedureRunner<T> where T : class, new()
{
private const string ConnectionString = "someConnectionString"
private readonly IMapper<T> mapper;
private readonly StoredProcedureResult<T> storedProcedureResult = new StoredProcedureResult<T>();
public StoredProcedureRunner(IMapper<T> mapper)
{
this.mapper = mapper;
}
public StoredProcedureResult<T> Run(
string storedProcedureName,
List<StoredProcedureParameterDefinition> parametersList = null)
{
try
{
using (var conn = new IfxConnection(ConnectionString))
{
conn.Open();
using (var cmd = new IfxCommand())
{
cmd.Connection = conn;
cmd.CommandText = storedProcedureName;
cmd.CommandType = CommandType.StoredProcedure;
if (parametersList != null)
{
foreach (var parameter in parametersList)
{
var parameterToAdd = new IfxParameter
{
ParameterName = parameter.ParameterName,
IfxType = parameter.ParameterType,
Value = parameter.ParamerValue,
Direction = parameter.ParameterDirection
};
cmd.Parameters.Add(parameterToAdd);
}
}
var ifxdr = cmd.ExecuteReader();
this.storedProcedureResult.Rows = this.mapper.Map(ifxdr).ToList();
if (parametersList != null)
{
foreach (var outputParameter in parametersList.Where(pl => pl.ParameterDirection == ParameterDirection.Output))
{
this.storedProcedureResult.OutputParameters.Add(
outputParameter.ParameterName,
cmd.Parameters[outputParameter.ParameterName].Value);
}
}
return this.storedProcedureResult;
}
}
}
catch (Exception ex)
{
throw new ApplicationException(ex.Message);
}
}
}
这是它的界面:
public interface IStoredProcedureRunner<T> where T : class
{
StoredProcedureResult<T> Run(
string storedProcedureName,
List<StoredProcedureParameterDefinition> parametersList = null);
}
问题是,毕竟它正在抛出异常:
ComponentActivator:无法实例化 StoreProcRunLib.DB.StoredProcedureRunner.FluentStoredProcedureRunner`1 [PromakGateway.WebApi.Models.InactiveAccountsTransferModel, PromakGateway.WebApi,Version = 1.0.0.0,Culture = neutral, 公钥=空]]
我在这里Castle Windsor - IoC registration for open generic interfaces?看到有一种适配器,但我不知道它是怎么样的。提前致谢。