Castle无法实例化我的课程

时间:2015-10-13 09:06:38

标签: c# asp.net-web-api castle-windsor owin

我有问题。我正在实现一个基于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?看到有一种适配器,但我不知道它是怎么样的。提前致谢。

0 个答案:

没有答案