Как я могу улучшить эту рабочую реализацию sqldependency? - PullRequest
1 голос
/ 25 июня 2019

Я новичок в C # MVC (около 6 месяцев самообучения), в настоящее время работаю над своим первым проектом, и недавно я столкнулся с проблемой дублирования SQL-зависимостей при обновлении страницы пользователем.Просматривая различные посты и статьи на разных сайтах, я собрал работающую реализацию, но я все еще разбираюсь в некоторых ее элементах, особенно в шаблоне синглтон-дизайна и различных модификаторах классов и свойств.Я хотел бы знать, есть ли какие-либо пробелы в моем коде или какие-либо другие соображения, которые я должен сделать, когда планирую установить еще несколько зависимостей?

Чтобы дать немного фона для масштаба проекта, он будет использоваться одновременно до 500 пользователями, и данные, влияющие на зависимость, будут меняться примерно раз в секунду в периоды занятости.

Большое спасибо заранее.:)

Вот мой класс зависимостей:

public sealed class UMCSingleton
{
    private static UMCSingleton instance;
    private static string connString = ConfigurationManager.ConnectionStrings["ServerConnection"].ConnectionString;
    private static SqlConnection conn = new SqlConnection(connString);
    private SqlDependency dependency;
    private static volatile object padlock = new object();

    private UMCSingleton() {}

    public static UMCSingleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new UMCSingleton();
                    }
                }
            }

            return instance;
        }

    }

    public static SqlConnection getUMCConnection()
    {
        try
        {               
            if(conn == null)
            {
                conn = new SqlConnection(connString);
                conn.Open();
                return conn;
            }

            if(conn.State == ConnectionState.Closed)
            {
                conn.ConnectionString = connString;
                conn.Open();
            }                
        }
        catch (SqlException e) {}
        finally {}
        return conn;
    }

    public void RegisterUnmanagdCallDependency()
    {
        using (getUMCConnection())
        {
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "SELECT [CallRef], [CallLoggedByUserId] FROM [dbo].[UnplannedCustomers] Where [ServiceFlowId] = 1";

                cmd.Notification = null;
                if (dependency == null || dependency.HasChanges == true)
                {
                    dependency = new SqlDependency(cmd);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                }

                using (SqlDataReader reader = cmd.ExecuteReader()) {}
            }
        }
    }

    void dependency_OnChange(object sender, SqlNotificationEventArgs e) //this will be called when any changes occur in db table. 
    {
        if (e.Type == SqlNotificationType.Change)
        {
            SqlDependency dependency = (SqlDependency)sender;
            if (dependency.HasChanges == true)
            {
                dependency.OnChange -= dependency_OnChange;
            }
            UnmanagedCallHub.ShowCalls();

            RegisterUnmanagdCallDependency();
        }
    }
}

Вот мой класс-концентратор:

    public class UnmanagedCallHubData
{
    public string CallRef { get; set; }
    public string RaisedBy { get; set; }
}

public class UnmanagedCallHub : Hub
{
    private ApplicationDbContext _context;
    public UnmanagedCallHub()
    {
        _context = new ApplicationDbContext();
    }

    public static void ShowCalls()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<UnmanagedCallHub>();
        context.Clients.All.UpdateCalls();

    }
}

И, наконец, мой контроллер API:

    public class UnmanagedCallController : ApiController
{
    private ApplicationDbContext _context;
    private UserProfile _uPro;

    //CONSTRUCTOR SETS DB CONTEXT
    public UnmanagedCallController()
    {
        _context = new ApplicationDbContext();
        ApplicationUser user = HttpContext.Current.GetOwinContext()
            .GetUserManager<ApplicationUserManager>().FindById(HttpContext.Current.User.Identity.GetUserId());
        _uPro = _context.UserProfiles.SingleOrDefault(x => x.UserId == user.Id);
    }

    [HttpGet]
    [Authorize]
    public List<UnmanagedCallHubData> GetUnmanagedCalls()
    {
        List<UnmanagedCallHubData> calls = _context.UnplannedCustomers
            .Where(x => x.ServiceFlowId == 1)
            .Where(x => x.CurrentManagerUserId == null)
            .Select(x => new UnmanagedCallHubData
            {
                CallRef = x.CallRef,
                RaisedBy = x.CallLoggedByUserId
            }).ToList();


        UMCSingleton.Instance.RegisterUnmanagdCallDependency();


        return calls;
    }
}
...