Sunday, November 17, 2013
Wednesday, October 23, 2013
Thursday, September 26, 2013
Dependency Injection
Dependency Injection (DI) is a software design
pattern that allow us to develop loosely coupled code. DI is a great way
to reduce tight coupling between software components. DI also enables
us to better manage future changes and other complexity in our software.
The purpose of DI is to make code maintainable.
The Dependency Injection pattern uses a builder object to initialize
objects and provide the required dependencies to the object means it
allows you to "inject" a dependency from outside the class. For example, Suppose your
Client
class needs to use a Service
class component, then the best you can do is to make your Client
class aware of an IService
interface rather than a Service
class. In this way, you can change the implementation of the Service
class at any time (and for how many times you want) without breaking the host code.We have following different ways to implement DI :
Constructor Injection
- This is the most common DI.
- Dependency Injection is done by supplying the DEPENDENCY through the class’s constructor when instantiating that class.
- Injected component can be used anywhere within the class.
- Should be used when the injected dependency is required for the class to function.
- It addresses the most common scenario where a class requires one or more dependencies.
The Injection happens in the constructor, by passing the Service that implements the IService-Interface. The dependencies are assembled by a "Builder" and Builder responsibilities are as follows:
- public interface IService
- {
- void Serve();
- }
- public class Service : IService
- {
- public void Serve()
- {
- Console.WriteLine("Service Called");
- //To Do: Some Stuff
- }
- }
- public class Client
- {
- private IService _service;
- public Client(IService service)
- {
- this._service = service;
- }
- public void Start()
- {
- Console.WriteLine("Service Started");
- this._service.Serve();
- //To Do: Some Stuff
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- client = new Client(new Service());
- client.Start();
- Console.ReadKey();
- }
- }
- knowing the types of each IService
- according to the request, feed the abstract IService to the Client
Property injection
- Also called Setter injection.
- Used when a class has optional dependencies, or where the implementations may need to be swapped. Different logger implementations could be used this way.
- May require checking for a provided implementation throughout the class(need to check for null before using it).
- Does not require adding or modifying constructors.
- public interface IService
- {
- void Serve();
- }
- public class Service : IService
- {
- public void Serve()
- {
- Console.WriteLine("Service Called");
- //To Do: Some Stuff
- }
- }
- public class Client
- {
- private IService _service;
- public IService Service
- {
- set
- {
- this._service = value;
- }
- }
- public void Start()
- {
- Console.WriteLine("Service Started");
- this._service.Serve();
- //To Do: Some Stuff
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Client client = new Client();
- client.Service = new Service();
- client.Start();
- Console.ReadKey();
- }
- }
Method injection
- Inject the dependency into a single method, for use by that method.
- Could be useful where the whole class does not need the dependency, just the one method.
- Generally uncommon, usually used for edge cases.
- public interface IService
- {
- void Serve();
- }
- public class Service : IService
- {
- public void Serve()
- {
- Console.WriteLine("Service Called");
- //To Do: Some Stuff
- }
- }
- public class Client
- {
- private IService _service;
- public void Start(IService service)
- {
- this._service = service;
- Console.WriteLine("Service Started");
- this._service.Serve();
- //To Do: Some Stuff
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Client client = new Client();
- client.Start(new Service());
- Console.ReadKey();
- }
- }
Key points about DI
- Reduces class coupling
- Increases code reusing
- Improves code maintainability
- Improves application testing
Monday, August 5, 2013
What's the difference between SQL Replication and SQL Database Mirror?
A.)
Mirroring:-
The Mirror database is not accessible for read or write access.
Replication:-
The Subscriber Database (backup site) is open to reads and writes.
B.)
Mirroring:-
Information flow will be only one way (from Principal to Mirror Server)
Replication:-
Changes
can be merged, bi-directional changes can be made, so the information
can flow from Publisher to Subscriber and the other way around.
C.)
Mirroring:-
In
case of failure of the Principal Database, the Mirror Database will
take over the control and will act as Principal and applications can be
redirected automatically to connect to this new Principal Server. Very
little downtime. No code change required in the application.
Replication:-
In
case of failure on Publisher, applications need to be re-directed to
the Subscriber manually (in case you really want to do that), requires
code change in the app or the connection string.
D.)
Mirroring:-
Almost everything inside the DB is replicated to the DR site, Schema changes can be replicated easily.
Replication:-
You have the option to replicate selected set of tables/SP/functions inside the DB, Schema changes can give some hiccups.
In
Short, Mirroring is a good tool for DR (Disaster Recovery) with very
little downtime, but the drawback is that the DR site will *not*
be accessible to users, whereas Replication can be used to Merge Data
between two Servers, can act as a good tool for Reporting purposes as
the backup site is accessible to the users, can also act a DR solution.
It
all depends on what you need, what are the business requirements ,
which will help you to choose the right topology in your environment.
You can go through SQL Books Online for more details about Mirroring and
Replication.
Sunday, August 4, 2013
Difference between Row_Number, Rank, Dense_Rank in Sql Server
Row_Number
Returns the sequential number of a row within a partition of a result set, starting at 1 for the first row in each partition.
ROW_NUMBER ( ) OVER ([<partition_by_clause>] <order_by_clause>)
Rank
Returns the rank of each row within the partition of a result set.<br/> The rank of a row is one plus the number of ranks that come before the row in question.
RANK ( ) OVER ([< partition_by_clause >] < order_by_clause >)
Dense_Rank
Returns the rank of rows within the partition of a result set,<br/> without any gaps in the ranking. The rank of a row is one plus the number of distinct ranks that come before the row in question.
DENSE_RANK ( ) OVER ([<partition_by_clause> ] < order_by_clause > )
NTILE
Distributes the rows in an ordered partition into a specified number of groups. <br/>The groups are numbered, starting at one. For each row, NTILE returns the number of the group to which the row belongs.
NTILE (integer_expression) OVER ([<partition_by_clause>] < order_by_clause >)
Where
<partition_by_clause>
Divides the result set produced by the From clause into partitions to which the Row_Number/ Rank/ Dense_Rank/ Ntile function is applied.
<order_by_clause>
Determines the order in which the Row_Number/ Rank/ Dense_Rank/ Ntile values are applied to the rows in a partition.
We will apply these function on the below customer product table CustProd.
name
|
Product
|
cust1
|
decoder
|
cust2
|
cable
|
cust1
|
cable
|
cust2
|
package
|
cust3
|
decoder
|
cust3
|
cable
|
Please see the below snapshot for understanding of these function through example
With partition by product and order by name,
When we use partition by product, then it divides the result on the basis of product, as there are three distinct products then there will be 3 partitions.
After partition, order by name is used, that means, in the partitions Row Number, Rank or Dense Rank will be assigned as per the order of name. Here in the below result we see that rank ,row number and dense rank, all are having same value, It’s because in each partition there are distinct name given, if name would have been repeated for the same product then those records will have same rank and dense rank, but row number would have been same as shown below.
When used order by product instead of name, then we see in the below result that, the Rank and dense Rank were 1, Because we did partition of result by product , that means there will be common product in each partition , and rank and dense rank will also be same for same product.
Tuesday, July 23, 2013
ViewBag & ViewData :
Similarities between ViewBag & ViewData :
- Helps to maintain data when you move from controller to view.
- Used to pass data from controller to corresponding view.
- Short life means value becomes null when redirection occurs. This is because their goal is to provide a way to communicate between controllers and views. It’s a communication mechanism within the server call.
Difference between ViewBag & ViewData:
- ViewData is a dictionary of objects that is derived from ViewDataDictionary class and accessible using strings as keys.
- ViewBag is a dynamic property that takes advantage of the new dynamic features in C# 4.0.
- ViewData requires typecasting for complex data type and check for null values to avoid error.
- ViewBag doesn’t require typecasting for complex data type.
CREATE WCF POST Restful service
CREATE WCF POST Restful service
Introduction
In my last article to explain about WCF Restful service using HTTP Get method. This works well as long as you are sending small data as information to the service. But if want to deliver huge data, HTTP GET Method is not a good choice.
In my last article to explain about WCF Restful service using HTTP Get method. This works well as long as you are sending small data as information to the service. But if want to deliver huge data, HTTP GET Method is not a good choice.
When
i write any WCF service, i always use POST. Reason is the advantage of
POST over GET. Using HTTP POST method, you can almost achieve everything
which you can achieve from GET. Despite of this you will get some
additional feature if use POST. We might say that "GET" is basically for
just getting (retrieving) data whereas "POST" may involve anything,
like storing or updating data, or ordering a product, or sending E-mail
etc.
POST
1) Easy Character Encoding using application/x-www-form-urlencoded
2) No Proxy by default so always actual data from web server.
3) Data length can be restricted by webserver, not by browser.
GET
1)
Character encoding will reduce the amount of data that can be used
because of url encoding entities (i.e. three Japanese characters are
converted to this: %26%2312454%3B%26%2312455%3B%26%2312502%3B)
2) Running a http request with GET can be cached on your web browser or a configured proxy server.
3)
Maximum URL length is 2,083 characters in Internet Explorer (see
MaxClientRequestBuffer: Use POST instead of GET to Send Large Amounts of
Data in Request)
and lot more
Extremely
long URLs are usually a mistake. URLs over 2,000 characters will not
work in the most popular web browser. Sending long information via URL
is not a good way of implementation and also there has many restrictions
i.e. max length of URL, Information format bla bla bla. For example
Internet Explorer has a limitation implemented at 2083 characters. URIs
is meant to be readable not to send information.
So if you are writing any REST service and your information is long enough, better to choose POST instead of GET method.
In
this article, i am going to create WCF Restful service using POST
method and access it using HTTP Request. So we will have client and
server both in this example code. I am creating one service which
accepts HTTP Post XML request and response request data in XML format.
STEP-1)
Launch Visual Studio 2010. Click FILE->NEW->PROJECT. Create new "WCF Service Application". .
STEP-2)
Once
you create the project, you can see in solution that By Default WCF
service and interface file are already created. Delete By default
created file as we will create our own interface and WCF service file.
STEP-3)
Now right click on solution and create one new WCF service file. I have given name to the service file as “RestServiceImpl.svc”.
STEP-4)
We will create two DataContract classes for request and response purpose.
RequestData
will receive the request from the client and ResponseData response. One
very important thing is that POST XML format to the service should be
same as RequestData. So the post xml request format can be like below:
We
must have to use namespace for the data contract in POST RESTFul
service, which have multiple use i.e. reflects the current version of
your code. The Same namespace should use in XML to Post data. Here i
have given http://www.eysnap.com/mPlayer as namespace which can be
changed.
STEP-5)
Now we will write the OperationContract in IRestServiceImpl which is an interface. Below is the code for that.
As
we can see in above code that here, Request and Response format is XML.
We can change it to JSON also by changing the WebMessageFormat from
WebMessageFormat.Xml to WebMessageFormat.Json
STEP-6
Implementation of Auth OperationContract in RestServiceImpl.svc.cs here.
Services
Behaviors
And that’s it. Our Restful WCF POST RESTful service is ready to test. SERVICE IS READY I have created one Test WebClient in C# which makes Http request with some XML data. My application is hosted on localhost and URL is http://localhost:35798/RestServiceImpl.svc/auth . I launched and invoked service using WebClient. Below is my XML response which is correct one.
Subscribe to:
Posts (Atom)