繁体   English   中英

C#Unity DI容器不接受带有RegisterType函数的Enum

[英]C# Unity DI container not accepting Enum with RegisterType function

看到下面的代码

    cont.RegisterType<IBBAConnection, BBAConnection>(ConType.local);
    cont.RegisterType<IBBAConnection, BBAConnection>(ConType.remote);
    cont.RegisterType<IBBAConnection, BBAConnection>(ConType.OrcsWeb);
    cont.RegisterType<IBBAConnection, BBAConnection>(ConType.Sage);

Unity RegisterType不接受枚举,但是如果我传递字符串,则不会出现任何问题,但是我必须使用枚举 我的完整代码如下。 因此,有人可以看到我的代码,并告诉我应该在代码中修复的内容和位置,因此应该接受枚举

完整的代码

public enum ConType { local, remote, OrcsWeb, Sage, };

public interface IBBAConnection
{
    IDbConnection  GetConnection();
    string ConType { get; set; }
}

public class BBAConnection : IBBAConnection
{
    public ConType ConType { get; set; }

    public IDbConnection GetConnection()
    {
        string _connectionString = "";
        IDbConnection connection = null;

        try
        {
            // inside if else logic we fetch connection string from ini file or from any source and inistialize connection.
            if (ConType == ConType.local)
            {
                _connectionString = "put here local db connection";
                connection = new System.Data.SqlClient.SqlConnection(_connectionString);
            }
            else if (ConType == ConType.remote)
            {
                _connectionString = "put here remote db connection";
                connection = new System.Data.SqlClient.SqlConnection(_connectionString);
            }
            else if (ConType == ConType.OrcsWeb)
            {
                _connectionString = "put here website db connection";
                connection = new System.Data.SqlClient.SqlConnection(_connectionString);
            }
            else if (ConType == ConType.Sage)
            {
                _connectionString = "put here sage connection";
                connection = new System.Data.SqlClient.SqlConnection(_connectionString);
            }

            connection.Open();
        }
        catch (Exception ex)
        {
            string strErr = ex.Message;
        }

        return connection;
    }
}

public static class Factory
{
    static IUnityContainer cont = null;

    public static IBBAConnection initialize(ConType oConType)
    {
        IBBAConnection oDbConnection = null;

        cont = new UnityContainer();
        cont.RegisterType<IBBAConnection, BBAConnection>(ConType.local);
        cont.RegisterType<IBBAConnection, BBAConnection>(ConType.remote);
        cont.RegisterType<IBBAConnection, BBAConnection>(ConType.OrcsWeb);
        cont.RegisterType<IBBAConnection, BBAConnection>(ConType.Sage);

        oDbConnection = cont.Resolve<IBBAConnection>(oConType);
        //oDbConnection.ConType = type;

        return oDbConnection;
    }
}

寻找指导原则,以使结果枚举应被接受。

以下是我认为您应该做的。

这将大大降低BBAConnection的复杂性,因为您可以让IConnectionConfig绑定确定所需的连接字符串。

public interface IConnectionConfig
{
    string GetConnectionString();
}

public class LocalConnectionConfig : IConnectionConfig
{
    public string GetConnectionString()
    {
        return "db connection for local";
    }
}

public class BBAConnection : IBBAConnection 
{ 
    private readonly IConnectionConfig config;

    public BBAConnection(IConnectionConfig config)
    {
        this.config = config;
    }

    public IDbConnection GetConnection()
    {
        string _connectionString = "";
        IDbConnection connection = null;

        try
        {
            connection = new System.Data.SqlClient.SqlConnection(this.config.GetConnectionString());

            connection.Open();
        }
        catch (Exception ex)
        {
            string strErr = ex.Message;
        }

        return connection;
    }
}

注册:

container.RegisterType<IBBAConnection, BBAConnection>();
container.RegisterType<IConnectionConfig, LocalConnectionConfig>();

从概念上讲

通常,您将让您的构建配置定义您正在使用的配置。 然后,您可以在代码中使用它来定义所需的配置。

暂无
暂无

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

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