google analytics

Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

Tuesday, September 7, 2010

Observer Pattern - implementation and application with C#.NET

Hello All

Today I will go through with “Observer Patter”, where I will try to explain a simple example of this pattern as well as implementation and use.

First come to what is Observer Patter, as per Wikipedia the general definition of Observer pattern is as bellow:

The observer pattern (a subset of the publish/subscribe pattern) is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods. It is mainly used to implement distributed event handling systems.

The UML diagram of basic observer pattern is as bellow:

clip_image002

How actually this pattern works?

Well as per the above definition we have 2 types of objects one is Subject and other one is Observer. A Subject maintain a list of Observe objects and notify those when property of subject changes.

Example:

Suppose we are maintaining stock exchanges data and we have number of securities agencies. Those securities consume our stock’s data as per there need. When they what to consume data, they register in our system and unsubscribe when they are needed. Here the catch is, they are always updated for each stock’s data change.

In the following C# code example I will try to pull out the gist of Observer pattern as per our above description.

In the code example I have taken 2 interfaces and 3 concrete classes of which 1 interface and 2 concrete classes are of Observer’s & 1 interface and 1 concrete class of Subject’s.

IObserver Interface:

This interface contains 2 method signatures. One is Update and another is ShowData.

 

using System.Collections.Generic;

namespace ObserverPatter
{
interface IObserver
{
void Update(Dictionary<string, float> stocks);

void ShowData();
}
}

FirstObserver concrete class:

This class implements the IObserver interface. The Update method changes the property of stocks information with the new stocks information and ShowData makes the new stock information visible.

using System;
using System.Collections.Generic;

namespace ObserverPatter
{
class FirstObserver : IObserver
{
private Dictionary<string, float> _stocks;

public void Update(Dictionary<string, float> newData)
{
this._stocks = newData;

this.ShowData();
}


public void ShowData()
{
Console.WriteLine("First Securities LTD");
foreach( KeyValuePair<string,float> data in _stocks)
{
Console.WriteLine("Current price of {0} is now {1}",data.Key,data.Value);
}
}
}
}

SecondObserver concrete class:

This class is also act as previous one. We are taking this class just to show as second observer which will be a subscriber of the server and will  be unsubscribe latter.

using System;
using System.Collections.Generic;

namespace ObserverPatter
{
class SecondObserver : IObserver
{
private Dictionary<string, float> _stocks;

public void Update(Dictionary<string, float> newData)
{
this._stocks = newData;
this.ShowData();
}


public void ShowData()
{
Console.WriteLine("Second Securities LTD");
foreach (KeyValuePair<string, float> data in _stocks)
{
Console.WriteLine("Current price of {0} is now {1}", data.Key, data.Value);
}
}
}
}

ISubject Interface:

This interface contains 3 main method's  signature 1.RegisterObserver 2.RemoveObserver 3.NotifyObservers

RegisterObserver method register an observe in subject’s observer list.

RemoveObserver method unregister an observer from the subject’s observer list.

NotifyObservers method is responsible to notify all objects which are subscribed to the server .


namespace ObserverPatter
{
interface ISubject
{
void RegisterObserver(IObserver o);
void RemoveObserver(IObserver o);
void NotifyObservers();

}
}
StockSubject concrete class:
 
We have implemented ISubject interface in this class and proceeded accordingly.
 
using System.Collections.Generic;

namespace ObserverPatter
{
class StockSubject : ISubject
{
private List<IObserver> _observers = new List<IObserver>();
private Dictionary<string, float> _stocks;

public void RegisterObserver(IObserver o)
{
_observers.Add(o);
}

public void RemoveObserver(IObserver o)
{
_observers.Remove(o);
}

public void NotifyObservers()
{
foreach(IObserver observer in _observers)
{
observer.Update(_stocks);
}
}

public void setStockPriceInformation(Dictionary<string,float> newData)
{
this._stocks = newData;
this.NotifyObservers();
}

}
}

Now in the runner class “Program” we have implemented our application where we have added two observers and letter removed one observer at runtime.
 
using System;
using System.Collections.Generic;

namespace ObserverPatter
{
class Program
{
static void Main(string[] args)
{

StockSubject stockSubject = new StockSubject();

var firstObserver = new FirstObserver();
var secondObserver = new SecondObserver();

stockSubject.RegisterObserver(firstObserver);
stockSubject.RegisterObserver(secondObserver);


var dataSet = new Dictionary<string,float>();
dataSet.Add("Google Inc", 500.25f);
dataSet.Add("Micorsoft",400.15f);

stockSubject.setStockPriceInformation(dataSet);

dataSet.Clear();
dataSet.Add("Google Inc", 330.25f);
dataSet.Add("Micorsoft", 550.15f);

stockSubject.RemoveObserver(secondObserver);

stockSubject.setStockPriceInformation(dataSet);

Console.ReadKey();
}
}
}

Output :
 
output 
Ok that’s it for today . Let me know if you have any concern regarding this pattern or code.
 
Take care
Bye

Sunday, February 28, 2010

Control inside repeater row ASP.NET

Hello All

Few days back I was struggling with a repeater problem , where I have to get a value of dropdown list on a button click event which is inside repeater. Eventually I come up with a solution through googling. What I have faced was get the value of appropriate dropdown list while clicking the button of a particular repeater’s row.

It’s being hard to describe rather that visualize :) isn’t it ! ( proposed solution should be as image bellow)

    My aspx markup is as bellow :

 <asp:Repeater runat="server" ID="rptTeamInfo" OnItemDataBound="rptTeamInfo_ItemDataBound" OnItemCommand="rptTeamInfo_ItemCommand">
               <ItemTemplate>
                <div class="side2">
                <div class="form">
                    <a href="#">delete</a><a href="#">edit /</a>
                    <ul class="p2">           
                      <span class="style1">[ <%#Eval("team_name")%> ]</span> - [ <%#Eval("creation_date")%>]<br />
                      <span class="style2">[<asp:Label runat="server" Text="ADMIN bla bla bla"></asp:Label>] - [ <%#Eval("team_leader")%>]</span> - [ <%#Eval("description")%>]
                     </ul>
                </div>                                                                        
                <div class="form2">
                <asp:ImageButton id="imgAddToTeam"  CommandName="select" CommandArgument='<%# Eval("team_id") %>'  ImageUrl="images/Add_to_team.png" runat="server" style="margin:10px;" align="right"></asp:ImageButton>
                <asp:DropDownList ID="ddlUserList" runat="server">
                
                </asp:DropDownList>
                    
                </div>
                <div class="row1">
                        <ul class="column">
                            <p><img src="images/name.png" /> Name</p>
                        </ul>
                        <ul class="column2">
                            <p><img src="images/username.png" /> Username</p>
                        </ul>
                        <ul class="column3">
                            <p><img src="images/username.png" /> Access</p>
                        </ul>
                </div>
                <div class="row2">                
                 <asp:Repeater ID="rptUserInfo"  OnItemDataBound="rptUserInfo_ItemDataBound" runat="server">
                       <ItemTemplate>
                    <asp:LinkButton id="lnkUserDelete" onclick="lnkUserDelete_Click" runat="server">delete</asp:LinkButton>
                    <ul class="column">
                        <p> <asp:Label runat="server" id="lblFirstNameIn"></asp:Label> <asp:Label runat="server" id="lblLastNameIn"></asp:Label></p>
                    </ul>
                    <ul class="column2">
                        <p> <asp:Label runat="server" id="lblUserIDIn"></asp:Label></p>
                    </ul>
                    <ul class="column3">
                        <p><asp:Label runat="server" id="lblUserTypeIn"></asp:Label></p>
                    </ul>
                        </ItemTemplate>                             
                 </asp:Repeater>                
                </div>
            </div>
               </ItemTemplate>
               </asp:Repeater>

And my code behind file is as bellow :

using System;
using System.Web.UI.WebControls;
using ClassLibrary1.UTILITY;

namespace WebDoc
{
    public partial class ManageTeam : System.Web.UI.Page
    {
        public int CurrentTeamID { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            lblUserId.Text = BUSessionUtility.BUSessionContainer.UserName;
            ManageTeamDAL manageTeamDAL = new ManageTeamDAL();
            rptTeamInfo.DataSource = manageTeamDAL.GetGroupsByManagerID(BUSessionUtility.BUSessionContainer.UserName);

            rptTeamInfo.DataBind();

        }
        protected void btnLogOut_Click(object sender, EventArgs e)
        {
            BUSessionUtility.BUSessionContainer.UserName = string.Empty;
            BUSessionUtility.BUSessionContainer.UserType = string.Empty;
            Response.Redirect("~/LoginUI.aspx");
        }

        protected void rptTeamInfo_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            DropDownList ddlUserList = (DropDownList)(e.Item.FindControl("ddlUserList"));

            ManageTeamDAL manageTeamDAL = new ManageTeamDAL();
            ddlUserList.DataSource = manageTeamDAL.GetUsersByManagerID(BUSessionUtility.BUSessionContainer.UserName);
            ddlUserList.DataTextField = "id";
            ddlUserList.DataValueField = "id";
            ddlUserList.DataBind();

            Repeater rptUserInfo = (Repeater)(e.Item.FindControl("rptUserInfo"));

            var row = e.Item.DataItem;
            rptUserInfo.DataSource = manageTeamDAL.GetUsersByAssignedTeamID(((team_info)(row)).team_id);
            rptUserInfo.DataBind();


        }

        protected void rptTeamInfo_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            if (e.CommandName == "select")
            {
                ImageButton imgAddToTeam = (ImageButton)e.CommandSource;

                DropDownList ddlUserList = (DropDownList)rptTeamInfo.Items[e.Item.ItemIndex].FindControl("ddlUserList");

                ManageTeamDAL manageTeamDAL = new ManageTeamDAL();

                manageTeamDAL.AssignUserInTeam(int.Parse(imgAddToTeam.CommandArgument), ddlUserList.SelectedValue.ToString());

                rptTeamInfo.DataSource = manageTeamDAL.GetGroupsByManagerID(BUSessionUtility.BUSessionContainer.UserName);

                rptTeamInfo.DataBind();
            }
        }

        protected void rptUserInfo_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            Label lblFirstName = (Label)(e.Item.FindControl("lblFirstNameIn"));
            Label lblLastName = (Label)(e.Item.FindControl("lblLastNameIn"));
            Label lblUserID = (Label)(e.Item.FindControl("lblUserIDIn"));
            Label lblUserType = (Label)(e.Item.FindControl("lblUserTypeIn"));
            LinkButton lnkUserDelete = (LinkButton)(e.Item.FindControl("lnkUserDelete"));

            var row = e.Item.DataItem;

            lblFirstName.Text = ((user_info)(row)).f_name;
            lblLastName.Text = ((user_info)(row)).l_name;
            lblUserID.Text = ((user_info)(row)).id;
            lblUserType.Text = ((user_info)(row)).user_type;
            lnkUserDelete.CommandArgument = ((user_info)(row)).id;


        }

        protected void lnkUserDelete_Click(object sender, EventArgs e)
        {
            ManageTeamDAL manageTeamDAL = new ManageTeamDAL();

            manageTeamDAL.DeleteUserformTeam(((LinkButton)(sender)).CommandArgument);

            rptTeamInfo.DataSource = manageTeamDAL.GetGroupsByManagerID(BUSessionUtility.BUSessionContainer.UserName);

            rptTeamInfo.DataBind();
        }

    }
}

Not all codes are important here and I will escape the data binding part as its not the focus of today’s topic. Now I will focus what we should do to perform our basic task.

first of all we have to do one most important  thing *** MAKE    EnableViewState="false" *** If ViewState is in true condition your are not going to handle  OnItemCommand event which will significantly react for your particular row’s activity.

 <asp:Repeater runat="server" ID="rptTeamInfo" OnItemDataBound="rptTeamInfo_ItemDataBound" OnItemCommand="rptTeamInfo_ItemCommand">

<ItemTemplate>

<asp:ImageButton id="imgAddToTeam" CommandName="select" CommandArgument='<%# Eval("team_id") %>' ImageUrl="images/Add_to_team.png" runat="server" style="margin:10px;" align="right"></asp:ImageButton>

<asp:DropDownList ID="ddlUserList" runat="server">

</asp:DropDownList>

</ItemTemplate>

</asp:Repeater>

The event handler “rptTeamInfo_ItemCommand” for the the event “OnItemCommand” is as bellow.

protected void rptTeamInfo_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "select")
    {
        ImageButton imgAddToTeam = (ImageButton)e.CommandSource;
        
        DropDownList ddlUserList = (DropDownList)rptTeamInfo.Items[e.Item.ItemIndex].FindControl("ddlUserList");
    
        ManageTeamDAL manageTeamDAL = new ManageTeamDAL();

        manageTeamDAL.AssignUserInTeam( int.Parse(imgAddToTeam.CommandArgument),ddlUserList.SelectedValue.ToString() );

        rptTeamInfo.DataSource = manageTeamDAL.GetGroupsByManagerID(BUSessionUtility.BUSessionContainer.UserName);

        rptTeamInfo.DataBind();
    }
}
We are passing the “CommandName” and “CommandArgument” through our image button which will check the command name in code behind and act with the command argument parameter.

We can get our ImageButton and DropdownList is as bellow from our code behind.

ImageButton imgAddToTeam = (ImageButton)e.CommandSource;

DropDownList ddlUserList = (DropDownList)rptTeamInfo.Items[e.Item.ItemIndex].FindControl("ddlUserList");

And selet the value of dropdown as bellow.

ddlUserList.SelectedValue

In this way we can accomplish our task regarding the repeater row’s control manipulation.

Thats all for today.

BYE

Wednesday, December 23, 2009

Dependency Injection with Ninject in .NET

Hello All

From last few months I was not working on .NET platform so haven’t get enough time to write something fruitful on .NET technology. But from last few few days I was thinking to do something with IoC . There are many DI tools to perform DI in .NET but I found Ninject useful as well as light waited and easily implementable. So lets start to make our hand dirty with the Ninject (there are many advanced level use of Ninject library but in this article I will simply show how to do DI with Ninject framework).

My project structure is as following .

In this example I’m taking 2 types of engine and 2 types of set and through Ninject DI I’ll inject one of each for a car. Fore the sake of simplicity I will place the code file accordingly and describe through code comment.

In my “DependencyInjection.Core” project I took 2 interfaces: 1.IEngine  2.ISeat

IEngine.cs is as following :

namespace DependencyInjection.Core
{
   public interface IEngine
    {
       string EngineType(string carName);
    }
}

I’m also taking 2 other classes 1.DieselEngine and 2.PetrolEngine  . Both of the classes implements IEngine interface.
DieselEngine.cs is as following :
namespace DependencyInjection.Core
{
   public  class DieselEngine : IEngine
    {
       public string EngineType(string carName)
       {
           return string.Format("This {0} runs on diesel.", carName);
       }
    }
}

PetrolEngine.cs is as following :
namespace DependencyInjection.Core
{
  public class PetrolEngine : IEngine
    {
        public string EngineType(string carName)
        {
            return string.Format("This {0} runs on petrol.", carName);
        }
    }
}

Now start for another type of interface implementation ISeat . This part also is as above.
ISeat.cs is as following :
namespace DependencyInjection.Core
{
   public interface ISeat
    {
       string SeatType(string carName);
    }
}

Two other classes 1.LeatherSeat and 2.PlasticSeat  . Both of the classes implements ISeat interface.
LeatherSeat.cs is as follwong:
namespace DependencyInjection.Core
{
   public class LeatherSeat : ISeat
    {
        #region ISeat Members

        public string SeatType(string carName)
        {
          return string.Format( "This {0}'s seats are of leather.",carName);
        }

        #endregion       
    }
}

PlasticSeat.cs is as following :
namespace DependencyInjection.Core
{
   public class PlasticSeat : ISeat
    {
        #region ISeat Members

        public string SeatType(string carName)
        {
            return string.Format("This {0}'s seats are of plastic.", carName);
        }

        #endregion
    }
}

In this point I’m adding reference of “Ninject.Core.dll” with my  “DependencyInjection.Core” project which I have downloaded from Ninject’s site. Now in my main class “Car” I’m going to inject one type of engine and another type of seat which I have mapped (DI mapping) through “IocMapper” class as bellow.
Car.cs is as bellow :
using Ninject.Core;

namespace DependencyInjection.Core
{
    public class Car
    {
        public IEngine CarEngine { get; set;}
        public ISeat   CarSeat   { get; set;}

        [Inject]
        public Car(IEngine engine , ISeat seat)
        {
            CarEngine   = engine;
            CarSeat     = seat;
        }

        
        public string GetEngineInformation(string carName)
        {
           return CarEngine.EngineType(carName);
        }


        public string GetSeatInformation(string carName)
        {
            return CarSeat.SeatType(carName);
        }
    }
}

In the above file  “ [Inject] “ attribute is place above the Car constructer to make it definable to Ninject so that Ninject can inject mapped object as described in “IocMapper” class.
I have taken another console application project named “DependencyInjection” in which I placed my “IocMapper” class.
IocMapper.cs is as following :
using Ninject.Core;

using DependencyInjection.Core;

namespace DependencyInjection
{
    public class IocMapper : StandardModule
    {
        public override void Load()
        {
            Bind<IEngine>().To<DieselEngine>();
         
            Bind<ISeat>().To<LeatherSeat>();
        }
    }
}

Now in program class I defined the kernel constructer and and initialize my car object.
Program.cs file is as bellow :
using System;
using Ninject.Core;
using DependencyInjection.Core;

namespace DependencyInjection
{
    class Program
    {
        static void Main(string[] args)
        {
            IKernel kernel = new StandardKernel(new IocMapper());

            Car car = new Car(kernel.Get<IEngine>(), kernel.Get<ISeat>());

            Console.WriteLine(car.GetEngineInformation("Toyota"));
           
            Console.WriteLine(car.GetSeatInformation("BMW"));
            
            Console.ReadKey();

        }
    }
}

We can do more advance level of conditional binding with Ninject. Hope in near future I will throw a post on advance use of Ninject.
That’s all for today.
BYE

Friday, November 13, 2009

.NET application logging with Log4net in Console , File & Database

Hello All

Today I will go through logging with Log4net. Log4Net is a logging framework ( a rich library) for .NET. Log4Net is popular for its simplicity and robustness. We can write log in various way though we generally write log only in file we we can also mail log, show in console,save in datatbase as well as write in file in different ways.

First we have to download the Log4Net and add the log4net.dll in our implementation project. In the example I have take 2 projects named LogWriter and LogRunner accordingly, In one project I have implemented the logging and in another I execute that logging method.

My project structure is as image bellow :

In the LogWriter I have take two class as bellow :

LogLevel.cs: In this class I simply define a enum which basically helps to define my log level in my LogUtil class.

namespace LogWriter
{
    public enum LogLevel
    { 
        DEBUG,
        ERROR,
        FATAL,
        INFO,
        WARN    
    }
}

LogUtil.cs: In this class I have a static method named WriteLog which take 2 parameters one define log level and another take log message as string.

using log4net;
using log4net.Config;

namespace LogWriter
{
    public static class LogUtil
    {
        private static ILog logger = LogManager.GetLogger(typeof(LogUtil));

        static LogUtil()
        {
            XmlConfigurator.Configure();
        }

        public static void WriteLog(LogLevel logLevel,string log)
        {
            if (logLevel.Equals(LogLevel.DEBUG))
            {
                logger.Debug(log);
            }
            else if (logLevel.Equals(LogLevel.ERROR))
            {
                logger.Error(log);
            } 
            else if (logLevel.Equals(LogLevel.FATAL))
            {
                logger.Fatal(log);
            } 
            else if (logLevel.Equals(LogLevel.INFO))
            {
                logger.Info(log);
            } 
            else if (logLevel.Equals(LogLevel.WARN))
            {
                logger.Warn(log);
            }             
        
        }
    }
}

As I am writing a  console application so my mail runner file is Program.cs which is as bellow but you can follow the same procedure in different place as per you requirement.

using System;
using LogWriter;

namespace LogRunner
{
    class Program
    {
        static void Main(string[] args)
        {
            try {
                throw new Exception();
            }

            catch (Exception exc)
            {
                    LogUtil.WriteLog(LogLevel.DEBUG, "Debug mode logging");
                    LogUtil.WriteLog(LogLevel.ERROR, "Error mode logging");
                    LogUtil.WriteLog(LogLevel.FATAL, "Fatal mode logging");
                    LogUtil.WriteLog(LogLevel.INFO, "Info mode logging");
                    LogUtil.WriteLog(LogLevel.WARN, "Warn mode logging");
    
                    Console.ReadKey();
            }
        }
    }
}

Now one of the most important thing I will focus is log4net configuration. We can configure it from web.config or app.config . In my example I have configured it app.config file in my LogRunner project. In the app.config file follow the commented section.

My configuration file is as bellow , please go through the commented line to get know in detail such as log file rolling, max log file number & size, Log level etc.
<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <configSections>

        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

    </configSections>


    <log4net>

        <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">

            <!-- Log file locaation -->
            
            <param name="File" value="C:\Users\sanzeeb\Documents\Visual Studio 2008\Projects\Solution1\LogWriter\Log\" />

            <param name="AppendToFile" value="true" />

            <!-- Maximum size of a log file -->
            <maximumFileSize value="2KB" />

            <!--Maximum number of log file -->
            <maxSizeRollBackups value="8" />

            <!--Set rolling style of log file -->
            <param name="RollingStyle" value="Composite" />

            <param name="StaticLogFileName" value="false" />

            <param name="DatePattern" value=".yyyy-MM-dd.lo\g" />

            <layout type="log4net.Layout.PatternLayout">

                <param name="ConversionPattern" value="%d [%t] %-5p  %m%n" />

            </layout>

        </appender>

        <!-- Appender layout fix to view in console-->
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >

            <layout type="log4net.Layout.PatternLayout">

                <param name="Header" value="[Header]\r\n" />

                <param name="Footer" value="[Footer]\r\n" />

                <param name="ConversionPattern" value="%d [%t] %-5p  %m%n" />

            </layout>

        </appender>

      
        <!-- Database appender -->

        <!--
        You need to create a table as bellow to insert log in database for MSSQL server.
        
        CREATE TABLE [dbo].[Log] (
        [Id] [int] IDENTITY (1, 1) NOT NULL,
        [Date] [datetime] NOT NULL,
        [Thread] [varchar] (255) NOT NULL,
        [Level] [varchar] (50) NOT NULL,
        [Logger] [varchar] (255) NOT NULL,
        [Message] [varchar] (4000) NOT NULL,
        [Exception] [varchar] (2000) NULL
        )
        -->

        <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
            <bufferSize value="100" />
            <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
            <connectionString value="Data Source=SANZEEB-PC\SQLEXPRESS;Initial Catalog=AppTesterDB;Integrated Security=True" />
            <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
            <parameter>
                <parameterName value="@log_date" />
                <dbType value="DateTime" />
                <layout type="log4net.Layout.RawTimeStampLayout" />
            </parameter>
            <parameter>
                <parameterName value="@thread" />
                <dbType value="String" />
                <size value="255" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%thread" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value="@log_level" />
                <dbType value="String" />
                <size value="50" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%level" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value="@logger" />
                <dbType value="String" />
                <size value="255" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%logger" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value="@message" />
                <dbType value="String" />
                <size value="4000" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%message" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value="@exception" />
                <dbType value="String" />
                <size value="2000" />
                <layout type="log4net.Layout.ExceptionLayout" />
            </parameter>
        </appender>

        <root>

            <level value="DEBUG" />

            <!--
            Log level priority in descending order:
            
            FATAL = 1 show  log -> FATAL 
            ERROR = 2 show  log -> FATAL ERROR 
            WARN =  3 show  log -> FATAL ERROR WARN 
            INFO =  4 show  log -> FATAL ERROR WARN INFO 
            DEBUG = 5 show  log -> FATAL ERROR WARN INFO DEBUG
            -->

            <!—To write log in file -->
            <appender-ref ref="LogFileAppender" />

            <!--To view log in console -->
            <appender-ref ref="ConsoleAppender" />
            
            <!--To write log in file batabase -->
            <appender-ref ref="AdoNetAppender" />

        </root>

    </log4net>

</configuration>

Hope this will help to improve your logging in your .NET application.

Thanks

That’s all for today.

BYE

Saturday, June 13, 2009

LinkButton ,Label inside Repeater - ASP.NET

Hello All

Today I will show you how to fire  Link Button's event with argument and initialize a label inside of a repeater. To do that first we have to take LinkButton and a Label control inside the ItemTemplate of the repeater. Then we have to initialize the the Label from OnItemDataBound event of the repeater. In the following code blocks its shown how to perform the job.

Following is my Default.aspx file:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestProject._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        Selected ID:<asp:Label ID="lblSelectedID" runat="server" Text=""></asp:Label>
        <br />
        <asp:Repeater ID="rptContent" runat="server" OnItemDataBound="rptContent_ItemDataBound">
            <ItemTemplate>
                <asp:Label ID="lblName" runat="server">
                </asp:Label>
                <asp:LinkButton ID="lnkShowData" runat="server" OnCommand="LinkButton_Command" CommandArgument='<%# Eval("key") %>'
                    Text="[Show]" CommandName="Show"></asp:LinkButton>
                <br />
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>

In the above code I have bind the "key" as CommandArgument in LinkButton which will be initialize form the code behind file.

My code behind is as following:

using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TestProject
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            rptContent.DataSource = this.userInformation();
            rptContent.DataBind();
        }

       // Fire the link button event from inside repeater.
       protected void LinkButton_Command(object sender, CommandEventArgs e)
        {
           lblSelectedID.Text = e.CommandArgument.ToString();
        }

        protected void rptContent_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            // find the label control by id
            Label lblDynaLabel = (Label)(e.Item.FindControl("lblName"));


            // bind the data from repeater data source (value from the dictionary)with the label control.
            lblDynaLabel.Text = DataBinder.Eval(e.Item.DataItem,"value").ToString();
        }

        #region Private method

        private Dictionary<int, string> userInformation()
        {
            Dictionary<int, string> userData = new Dictionary<int, string>();

            userData.Add(1, "Max");
            userData.Add(2, "Top");
            userData.Add(3, "Avg");

            return userData;
        }
        #endregion
    }
}

The output will be as bellow:

Selected ID:1
Max [Show]
Top [Show]
Avg [Show]

In the private method section I have created a simple mathod named userInformation, which contains dictionary data collection to bind it with repeater.Hope that above code blocks will help.

Thanks

That's all for the day.
BYE

User ScrumPad for your Agile based projects.

Thursday, May 28, 2009

Print C# properties in aspx,ascx page from code behind file.

Hello all

Today I will show you how to print something in aspx or ascx page from code behind file.In this example I have taken a “Web User Control” named “WebUserControl.ascx”. What I wanted to do was, print a value of a variable in “.ascx” page where the variable has been initialize from “.ascx.cs” better to say code behind file.

To do that we have taken a property in “WebUserControl.ascx.cs” code behind file named “PrintValue” and make it a public property and assign a string value on PageLoad event as bellow :

using System;

public partial class WebUserControl : System.Web.UI.UserControl
{
    public string PrintValue { get; set; }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
            PrintValue = "Postback";
        else
            PrintValue = "Not postback";
    }
}

Now I have printed the value of the property in my “WebUserControl.ascx” page as bellow.One thing we have to remember that the script tag should be like : <%= %> to print something in it.
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>

The page has - <%= PrintValue %>

Now we can use the control in our page to show the state of the page.
Thats all for today.
Bye
User ScrumPad for your Agile based projects.

Monday, May 4, 2009

File streaming in .NET

Hello All

Today i will focus on simple file steaming in .NET which I have to implement it in one of my project.Though it’s not optimize but its OK for serve small purpose.

In the project I have to read a PDF file from the server and with FileStream and Flash it with Response to the client side.

the code is as bellow.

private void generateRequestedPDF()
{
    try
    {
        string file = Path.GetFileName(Request.QueryString["RefID"]);// get file name from query string.use your custom method." 

        FileStream fileStream = new FileStream(Server.MapPath(@"~\uploadedFiles\" + file), FileMode.Open);
        long fileSize = fileStream.Length;

        byte[] buffer = new byte[(int)fileSize];
        fileStream.Read(buffer, 0, (int)fileSize);
        fileStream.Close();

        Response.Clear();

        Response.ContentType = "Application/pdf";// use your custom type"
        Response.AddHeader("Content-Disposition", "inline; filename=" + file);

        Response.OutputStream.Write(buffer, 0, (int)fileSize);
        Response.Flush();
        Response.Close();
    }
    catch (Exception exc)
    {
    //  throw exc;
        this.writeLogWarn(exc);
        Response.Redirect("~/Pages/Content/TechCorner.aspx");
    }
   
}
thats all for today.
BYE

User ScrumPad for your Agile based projects.

Saturday, April 11, 2009

Consume WCF Service

Hello all

Today I will show how to consume a WCF service. To go through this before, I have created a WCF service [ Creating WCF Service ] , which I will consume for my project in this article. Consuming WCF Service is as simple as consuming a simple webservice through Visual Studio 2008.

First I am taking an empty Web project named ConsumedWCF.

Now I will add a service reference which I have created before [ Creating WCF Service ] in this ConsumedWCF project as bellow:

In my previously created WCF service I have got a URL for my service "http://localhost:49530/DataService.svc?wsdl", I have pasted the URL in the Address box. One thing we should have to remember that,to consume the service we have to run that service during development.

Now I will consume the service from my Default.aspx  . My Default.aspx.cs content is as bellow:

using System;
using ConsumeWCF.ServiceReference1;

namespace ConsumeWCF
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           DataServiceClient cl = new DataServiceClient();
           Response.Write( cl.GetUserDataFromService().UserName);
           Response.Write("<br />");
           Response.Write(cl.GetUserDataFromService().UserLocation);
           Response.Write("<br />");
           Response.Write(  cl.GetUserRestrictionFromService("1"));
           Response.Write("<br />");
           Response.Write(cl.GetUserRestrictionFromService("23"));
           
        }
    }
}

The above code will print the values which we have consumed form the WCF service.

Thanks

That's all for the day.
BYE

User ScrumPad for your Agile based projects.

Tuesday, March 31, 2009

Creating WCF Service

Hello all

Today I will try to demonstrate how to create simple web service through WCF. To get into WCF first we have to know some basic principal of WCF and its "ABC".

Address : the location of the service.

Bind: how to get service.

Contract: service action.

In this tutorial I will not describe details about WCF.My basic focus will be on creating a WCF service through Visual Studio 2008

First open a new WCF project:

In my sample project I have named "TestWCFService" for creating the service.

In the solution explorer you will found IService1.cs interface , Service1.svc file and a code behind file Service1.svc.cs

In my project I have renamed those as IDataService.cs, DataService.svc and DataService.svc.cs accordingly. To change the markup file of DataService.svc right click on the DataService.svc file in solution explorer and press "View Markup" as bellow

and change the Service according to you code as bellow.

<%@ ServiceHost Language="C#" Debug="true" Service="TestWCFService.DataService" CodeBehind="DataService.svc.cs" %>

In the solution my IDataSevice.cs is as bellow:

using System.Runtime.Serialization;
using System.ServiceModel;

namespace TestWCFService
{
    
    [ServiceContract]
    public interface IDataService
    {

        [OperationContract]
        UserInformation GetUserDataFromService();

        [OperationContract]
        string GetUserRestrictionFromService(string userID);
        
        // TODO: Add your service operations here
    }


    // Use a data contract as illustrated in the sample below to add composite types to service operations.
    [DataContract]
    public class UserInformation
    {

        [DataMember]
        public string UserName { get; set; }

        [DataMember]
        public string UserLocation { get; set; }

      
        public string UserRestriction(int userID)
        {
            if (userID.Equals(1))
                return "approve";
            else
                return "rejected";
        }
       
    }
}

My DataService.svc.cs file is as bellow :

using System;

namespace TestWCFService
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
    public class DataService : IDataService
    {
        #region IDataService Members

        public UserInformation GetUserDataFromService()
        {
            return new UserInformation() { UserName = "Tanvir", UserLocation = "Dhaka" };
        }

        public string GetUserRestrictionFromService(string userID)
        {

            UserInformation userInformation = new UserInformation();

            if (userInformation.UserRestriction(Int32.Parse(userID)).Equals("approve"))
                return String.Format("your user id is {0} and you are approved", userID);
            else
                return String.Format("your user id is {0} and you are not approved", userID);

        }

        #endregion
    }
}

And the most important thing is to change in system.servieModel section in Web.config file as bellow :

<system.serviceModel>
        <services>
            <service name="TestWCFService.DataService" behaviorConfiguration="TestWCFService.Service1Behavior">
                <!-- Service Endpoints -->
                <endpoint address="" binding="wsHttpBinding" contract="TestWCFService.IDataService">
                    <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="TestWCFService.Service1Behavior">
                    <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                    <serviceMetadata httpGetEnabled="true"/>
                    <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>

We have to change the underline and bold section up above according to you code and naming in our solution.

Thanks

That's all for the day.
BYE

User ScrumPad for your Agile based projects.