Pixytech

Category: C#

  • Cross AppDomain Tasks

    As a part of plugin system, I build a framework that allows you to host plugins in current app domain, new app domain or external process host. The next channel is to run an long running task in new app domain and control it from any side of wire and here is the simple API with help of two classes..

    public class RemoteTask : MarshalByRefObject
     {
     private readonly EventWaitHandle _completionEvent;
     
     public bool IsCanceled { get; protected set; }
    
     public bool IsCompleted { get; protected set; }
    
     public Exception Exception { get; protected set; }
    
     public bool IsFaulted { get; protected set; }
    
     public string Id { get; private set; }
    
     
     protected RemoteTask(CancellationToken cancellationToken)
     {
     Id = Guid.NewGuid().ToString();
     _completionEvent = new EventWaitHandle(false, EventResetMode.ManualReset, Id);
    
     cancellationToken.Register(() =>
     {
     IsCompleted = false;
     IsCanceled = true;
     Finished();
     });
     }
    
     public RemoteTask(CancellationToken cancellationToken, TaskAwaiter awaiter) : this(cancellationToken)
     {
     awaiter.OnCompleted(() =>
     {
     try
     {
     awaiter.GetResult();
     IsFaulted = false;
     IsCompleted = awaiter.IsCompleted;
     }
     catch (Exception exception)
     {
     Exception = exception;
     IsFaulted = true;
     }
     Finished();
     });
     }
    
     protected void Finished()
     {
     _completionEvent.Set();
     }
    
     public static void WaitWorker(RemoteTask worker)
     {
     var waiter = new EventWaitHandle(false, EventResetMode.ManualReset, worker.Id);
     waiter.WaitOne();
     }
     }

    And class RemoteTaskOfT if you need results out from your task

    public class RemoteTask : RemoteTask
        {
            public RemoteTask(CancellationToken cancellationToken, TaskAwaiter awaiter):base(cancellationToken)
            {
                awaiter.OnCompleted(() =>
                {
                    try
                    {
                        Result = awaiter.GetResult();
                        IsFaulted = false;
                        IsCompleted = awaiter.IsCompleted;
                    }
                    catch (Exception exception)
                    {
                        Exception = exception;
                        IsFaulted = true;
                    }
                    Finished();
                });
            }
    
            public T Result { get; private set; }
        }
    

    to use it from inside the new app domain
    just return new RemoteTask(cancellationToken, task.GetAwaiter())
    and on client side use
    RemoteTask.WaitWorker(worker);
    int result = worker.Result;
    Exception ex = worker.Exception;

  • Asp.Net MVC flavours

    The main purpose of the MVC (Model, View and Controller) architecture is to make separation of the business layer (logic) and the application layer (data)  from the presentation layer to the user. Model-View-Controller is a software pattern for achieving isolation between different application components. Its always desirable for software applications (especially web-based applications) that there must be clear separation between business logic and the user interface. A model represents the state of a particular aspect of the application. A controller handles interactions and updates the model to reflect a change in state of the application, and then passes information to the view. A view accepts necessary information from the controller and renders a user interface to display that information. Over past few years many version of ASP.Net MVC were release moving towards more and more mature framework for web development.Below is brief comparison of features release in each version

    MVC 5 – October 2013

    • Bootstrap replaced the default MVC template.
    • ASP.NET Identity for authentication and identity management.
    • Authentication Filters for authenticating user by custom or third-party authentication provider.
    • With the help of Filter overrides, we can now override filters on a method or controller.
    • Attribute Routing is now integrated into MVC 5

    MVC 4 – August 2012

    • ASP.NET Web API, a framework that simplifies the creation of HTTP services and serving a wide range of clients.
    • Follow to create your first ASP.NET Web API service
    • Adaptive rendering and other look-n-feel improvements to Default Project Templates.
    • A truly Empty Project Template.
    • MVC4 also uses Razor View Engine as a default view engine with some new features like condition attribute and ‘Tilde slash’
    • Based on jQuery Mobile, new Mobile Project Template introduced.
    • Support for adding controller to other project folders also.
    • Task Support for Asynchronous Controllers.
    • Controlling Bundling and Minification through web.config.
    • Support for OAuth and OpenID logins using DotNetOpenAuth library.
    • Support for Windows Azure SDK 1.6 and new releases.
    • MVC4 provides better support for Jquery like Jquery Mobile
    • Client side validation, Jquery validation and enhanced support for asynchronous methods
    • Supports many new features for mobile apps and also provides new mobile project template and default templates are refreshed and modernized

    MVC 3 – January 2011

    • New Project Templates having support for HTML 5 and CSS 3.
    • Improved Model validation.
    • Razor View Engine (.cshtml for c# and .vbhtml for Visual Basic) introduced apart from Web Forms view engine (.aspx)
    • Having support for Multiple View Engines i.e. Web Forms view engine, Razor or open source.
    • Controller improvements like ViewBag property and ActionResults Types etc.
    • Unobtrusive JavaScript approach, Ajax and Client side Validation, Jquery Validation and JSON binding support
    • Chart, WebGrid, Crypto,WebImage, WebMail Controls
    • Improved Dependency Injection with new IDependencyResolver.It provides powerful hooks with Dependency Injection and Global Action Filters
    • Partial page output caching.
    • TempData, ViewData ,ViewBag
    • Supports not only Master Page but also Layout Page

    MVC 2 – March 2010

    • MVC 2 uses only Web Forms view engine (.aspx) as a default View Engine.
    • (HTML Syntax) Web Forms view engine syntax: <%=Html code %>
    • TempData, ViewData
    • Jquery support is Good
    • Supports only Master Page
    • Client-side Validation and Asynchronous controllers
    • support controllers to process requests asynchronously
    • Supports validations using the RangeAttribute, RequiredAttribute, StringLengthAttribute, and RegexAttribute attributes.

    MVC 1 – March 2009

    MVC CTP – December 2007 

    * Notes

    • View Engine is responsible for rendering of the HTML code from your views to the browser.
    • In ViewData, dictionary of objects are accessible via strings as keys
    • ViewBag was added in the C# 4.0 which uses the dynamic feature that allows to add properties of an object dynamically . We can say that ViewBag = ViewData + dynamic feature around the ViewData dictionary
  • Prism Navigation – ViewModel first

    Navigating to view using prism navigation service is straight forward and there are lot of examples on web around this.With MVVM i always found ViewModel first approach as best because of lot of reasons, some of them are

    • With MVVM, ViewModels is your application
    • No threading issues as you will always create view models which can be created on any thread.
    • More responsive , you are not dealing with dispatcher context to create views and let WPF system decide when to create views.
    • No Memory leaks, The life cycle of views is controlled by WPF system in most efficient way
    • More testable application, Since you app lives in view models and they don’t have UI beasts,
    • And lot more..

    This post cover a small trick to implement the ViewModel first navigation using Prism 5.0 for WPF.

    1. What ever IoC you are using (the code is based on StructuralMap) expose the RegisterForNavigation<T> method and from module initialization, register interface of viewModels participating in navigation process. The RegisterForNavigation<T> will look like

    public static void RegisterTypeForNavigation<T>(this ConfigurationExpression reg)
    {
    reg.For<object>().Use(() => ServiceLocator.Current.GetInstance(typeof(T)))
    .Named(typeof(T).FullName);
    }
    

    And some where in module initialization you call this method

    configurationExpression
    .RegisterTypeForNavigation<ICustomerDetailViewModel>();
    

    And to navigate to this view model just use

    var parameters = new NavigationParameters { { "Activity", SelectedActivity }, { "ColumnName", columnName } };
    var uri = new Uri(typeof(ICustomerDetailViewModel).FullName, UriKind.RelativeOrAbsolute);
    regionManager.RequestNavigate(ShellRegions.Workspace, uri, parameters);
    

    And obviously some where in you data template definition there should a (DataTemplate) mapping which WPF uses to swap the view model with corresponding view (and set data context too)..