Entries in .NET (13)

Silverlight 2.0 Video Tutorials

Silverlight 2.0 provides a new and exciting framework for building rich applications using C#, VB.NET or other languages that are capable of running on multiple operating systems and in multiple browsers.  Scott Guthrie recently posted a great set of tutorials on Silverlight 2.0 that are an excellent resource for getting started building Silverlight 2.0 applications. 

Scott recently approved converting the tutorials into video so I've been busy the past few days putting together video tutorials that cover Silverlight 2.0 and the Digg.com application Scott wrote about.  Links to the written tutorials and video tutorials are shown below.

Silverlight 2.0 Video Tutorials

Part 1: Creating "Hello World" with Silverlight 2 and VS 2008TutorialVideo Tutorial
Part 2: Using Layout ManagementTutorialVideo Tutorial
Part 3: Using Networking to Retrieve Data and Populate a DataGridTutorialVideo Tutorial
Part 4: Using Style Elements to Better Encapsulate Look and FeelTutorialVideo Tutorial
Part 5: Using the ListBox and DataBinding to Display List DataTutorialVideo Tutorial
Part 6: Using User Controls to Implement Master/Details ScenariosTutorialVideo Tutorial
Part 7: Using Templates to Customize Control Look and FeelTutorialVideo Tutorial
Part 8: Creating a Digg Desktop Version of our Application using WPFTutorialVideo Tutorial


View other cool videos on Silverlight 2.0 and additional .NET technologies from the Mix 08 conference:

Joshua Allen's Mix 08 Blog


del.icio.us Tags: ,,,,
Posted on Saturday, March 8, 2008 at 10:12PM by Registered CommenterDan Wahlin in , , , , , , , | CommentsPost a Comment | EmailEmail | PrintPrint

SmartWebControls.com Released

Last night we released a new version of the OrgChart.NET ASP.NET server control under a new name of "SmartChartPro".  We decided to give the control a new name since it's capable of doing more than just OrgCharts (although that's what most companies use it for).  We also released a  new company website named SmartWebControls.com based on .NET 3.5 where SmartChartPro and other upcoming controls will now reside. 

image

I decided to use LINQ and Lambdas in conjunction with LINQ to SQL in the back-end data classes for the new site.  Using these new technologies saved an enormous amount of time and made the process a lot more fun since we didn't have to go through the tedious process of mapping DataReader properties to custom data entity class properties as we'd done in the past.

If you or your boss are holding off on .NET 3.5 I'd definitely recommend taking a closer look as your productivity will increase a lot by using the new features it offers plus your code base will be more maintainable into the future.

Posted on Wednesday, February 27, 2008 at 02:48PM by Registered CommenterDan Wahlin in , , | CommentsPost a Comment | EmailEmail | PrintPrint

Getting Ready for Silverlight 2.0

Posted on Friday, February 22, 2008 at 09:49AM by Registered CommenterDan Wahlin in , | CommentsPost a Comment | EmailEmail | PrintPrint

Testing Email Messages Sent using System.Net.Mail on Windows Vista

I've been developing for months on Windows Vista and had everything I needed at my disposal.  Last night, however, I needed to test whether or not email messages were being successfully sent from an ASP.NET application and see what they looked like.  I went to look for an SMTP server in Vista Ultimate and quickly found that there isn't one.  IIS7 includes email forwarding capabilities, but I wanted a simple SMTP server (or something that could emulate one) so that I could see the email messages that were being sent. 

After doing a little research I found a few programs that fit the bill for testing email sent from applications running on Vista.  The first is a free program called "Free SMTP Server" that Steve Schofield blogged about awhile back.  You can read Steve's post about the application here:

http://blogs.orcsweb.com/steve/archive/2007/09/08/vista-and-an-smtp-server-on-port-25-or-587.aspx

Here's what the program looks like while running (it's a stand-alone program rather than a service which actually worked out well for my situation).  It allows you to configure the DHCP server and the port that's used which is nice if your ISP blocks port 25.

image

The second program was actually even better for my current testing purposes since I really didn't need an SMTP server installed.  I needed to see what the actual email messages that were sent looked like to make sure data was formatted properly.  The program's called "Antix SMTP Server for Developers" and can be found here:

http://channel9.msdn.com/ShowPost.aspx?PostID=281695#281695

image

This program isn't actually an SMTP server (more of an emulator), but it captures any messages sent to port 25 and stores them in a folder.  You can then view the messages directly to make sure they contain the information you were looking for while testing. 

There are obviously a lot of full-blown SMTP servers out there that would work, but for testing purposes these two programs did the job for me.

Update:  David Findley posted something that I hadn't thought of using that's even easier.  Adding this to web.config will dump email messages sent from an ASP.NET application to the specified path:

<system.net>
  <mailSettings>
    <!--
    Production setting
    
    <smtp deliveryMethod="Network">
      <network host="localhost" port="25" />
    </smtp>
    
    -->

    <smtp deliveryMethod="SpecifiedPickupDirectory">
      <specifiedPickupDirectory pickupDirectoryLocation="C:\TestMessages" />
    </smtp>

  </mailSettings>
</system.net>
Posted on Thursday, February 21, 2008 at 01:34PM by Registered CommenterDan Wahlin in | CommentsPost a Comment | EmailEmail | PrintPrint

Building an N-Layer ASP.NET Application with LINQ, Lambdas and Stored Procedures (Updated)

Update:  I refactored some of the code and also did a better job ensuring Dispose() is called everywhere so that the DataContext object gets cleaned up properly.

Download the Application Here

.NET 3.5 has a lot of great new features that can significantly enhance developer productivity.  I've been spending some time lately working on a little sample application that demonstrates how an N-Layer ASP.NET 3.5 application can be built using LINQ, lambdas and LINQ with stored procedures.  The application is for a talk I'll be giving at DevConnections in April discussing how LINQ technologies can be used in an N-Layer architecture.  In a previous post comparing different LINQ options I mentioned that I'd be posting the code download as soon as it was ready.

The application provides a presentation layer, business layer, data layer and model layer through separate projects as shown next:

image

It also demonstrates how the new ListView control can be used to display data, perform insert, update and delete operations and nest other controls such as the GridView.  Databinding on the presentation layer is mainly done using the ObjectDataSource control.

Application Example

All of the queries performed in the application go against an object model created using the Visual Studio 2008 LINQ to SQL Designer. 

Note:  The included Northwind SQL Express database has been modified slightly to add a TimeStamp field into the Customer and Orders tables.  Doing so simplifies updates so be aware that if you change the connection string to point to a standard Northwind database you'll get an error since the TimeStamp fields will be missing.


3 Options for Data Access

Rather than focusing solely on LINQ, I wanted to show different options for data access that .NET 3.5 offers so that developers can get a feel for what's available in addition to standard LINQ queries that seem to get most of the attention these days.  I ended up creating six main data layer classes as shown next:

Customer Query Classes:

  • CustomerDBLINQ - Executes customer related queries using inline LINQ
  • CustomerDBLambda - Executes customer related queries using lambda expressions
  • CustomerDBSprocs - Executes customer related queries using stored procedures and LINQ

Order Query Classes:

  • OrderDBLINQ - Executes order related queries using inline LINQ
  • OrderDBLambda - Executes order related queries using lambda expressions
  • OrderDBSprocs - Executes order related queries using stored procedures and LINQ

I still lean toward using stored procedures due to the security and maintenance benefits they offer in more enterprise environments, but for small queries I actually prefer lambda expressions over LINQ (not sure why...just feels more object oriented I guess).  If you currently use stored procedures in your applications and haven't checked out the new LINQ to SQL Designer you'll be impressed with how easy it is to call stored procedures and pass parameters.  You never have to see or create another SqlCommand or SqlParameter object again (well...in many cases anyway).


Switching Between Data Access Classes

By changing a value in web.config you can switch between the different data layer classes and see which option you prefer (LINQ, lambdas or LINQ with sprocs).  All of the data access classes perform the same overall tasks, they just use different techniques to do it.

<appSettings>
  <!-- 
    Used to define which DB layer class should be loaded and used. 
    Valid customer values include:  Data.CustomerDBSprocs, Data.CustomerLINQ, Data.CustomerLambda
    Valid order values include: Data.OrderDBSprocs, Data.OrderLINQ, Data.OrderLambda
  -->
  <add key="CustomerDBType" value="Data.CustomerDBLINQ" />
  <add key="OrderDBType" value="Data.OrderDBLINQ" />
  <!-- When the following key is set to "true" ensure that 
EnablePartialRendering is set to false on the Default.aspx ScriptManager control --> <add key="EnableDataContextLogging" value="false" /> </appSettings>

Over the next few weeks I'm hoping to make some time to walk through the application pieces.  I may create some video tutorials about it as well....we'll see how time goes.

 

Posted on Monday, February 18, 2008 at 06:27PM by Registered CommenterDan Wahlin in , , , , | CommentsPost a Comment | EmailEmail | PrintPrint

LINQ and Lambdas and Sprocs....Oh My!

There's a lot of great stuff in .NET 3.5 and several different ways to work with LINQ technologies such as LINQ to SQL.  I'm currently putting together some demonstration code for a talk I'll be giving at DevConnections in Orlando and showing how LINQ, Lambdas and LINQ with stored procedures can be used to do the same thing so that people get a feel for each technique.  For shorter queries I generally prefer lambdas since it's more object-oriented feeling compared to LINQ (to me anyway).  For more complex queries LINQ is much easier though.  Overall, I still prefer stored procedures since you have much more control over security that way and can maintain queries without resorting to C#/VB.NET code changes in some cases.  Plus, LINQ makes it really easy to pass parameters to stored procedures without having to create SqlParameter objects (something I've always despised).

Although I've found that I like lambdas a lot for more simple queries, I was working on some lambda code yesterday that was just plain out of control and much more complex when compared to using LINQ or LINQ against a sproc.  Here's an example of the overall query I was after which has several inner joins.  This particular query was automatically generated using LINQ code and I logged the output and converted it to a stored procedure named ap_GetOrderDetailsByOrderID.  It's structured a little differently than I would typically write, but accomplishes the same end goal.

CREATE PROCEDURE dbo.ap_GetOrderDetailsByOrderID
    (
        @OrderID int
    )
AS
    BEGIN
        SELECT [t5].[CompanyName] AS [ShipperName], 
        [t5].[ProductName] AS [Product], 
        [t5].[value] AS [Total], 
        CONVERT(Int,[t5].[Quantity]) AS [Quantity], 
        [t5].[UnitPrice], 
        [t5].[CompanyName2] AS [SupplierName] 
        FROM ( 
            SELECT [t0].[OrderID], 
                    [t1].[CompanyName], 
                    [t2].[UnitPrice], 
                    [t2].[Quantity], 
                    [t3].[ProductName], 
                    [t4].[CompanyName] AS [CompanyName2], 
                    (CONVERT(Decimal(29,4),[t2].[Quantity])) * [t2].[UnitPrice] AS [value] 
            FROM [dbo].[Orders] AS [t0] 
            INNER JOIN [dbo].[Shippers] AS [t1] ON [t0].[ShipVia] = ([t1].[ShipperID]) 
            INNER JOIN [dbo].[Order Details] AS [t2] ON [t0].[OrderID] = [t2].[OrderID] 
            INNER JOIN [dbo].[Products] AS [t3] ON [t2].[ProductID] = [t3].[ProductID] 
            INNER JOIN [dbo].[Suppliers] AS [t4] ON [t3].[SupplierID] = ([t4].[SupplierID]) ) 
        AS [t5] WHERE [t5].[OrderID] = @OrderID 

    END

The examples that follow go against the LINQ to SQL objects shown next that I created in Visual Studio 2008 using the LINQ to SQL Designer.  All of the objects came from the Northwind database except the custom OrderDescription object.

image

Using LINQ

LINQ can be used to automatically generate the query shown above by doing the following:

public override IEnumerable<OrderDescription> GetOrderDetails(int orderID)
{
    NorthwindDataContext db = this.DataContext;
    IEnumerable<OrderDescription> orderDetails =
        from o in db.Orders
        where o.OrderID == orderID
        join s in db.Shippers on o.ShipVia equals s.ShipperID
        join od in db.OrderDetails on o.OrderID equals od.OrderID
        join p in db.Products on od.ProductID equals p.ProductID
        join supplier in db.Suppliers on p.SupplierID equals supplier.SupplierID
        let total = od.Quantity * od.UnitPrice
        select new OrderDescription {Product = p.ProductName, Quantity = od.Quantity, 
                     ShipperName = s.CompanyName, Total = total, UnitPrice=od.UnitPrice,
                     SupplierName = supplier.CompanyName};
    return orderDetails;

}

This code joins 5 tables to grab order details and adds the target fields to the custom OrderDescription object.  By using this code the SQL is created on the fly from LINQ expression trees and sent to the database so any changes to the query require changes to the code of course.  For those that don't like working with stored procedures this certainly is the next best thing.

A better way of doing this that leverages relationships between objects defined in the LINQ to SQL data model is shown next (thanks to Christian Nagel):

IEnumerable<OrderDescription> orderDetails =
  from o in db.Orders
  where o.OrderID == orderID
  from od in o.OrderDetails
  let total = od.Quantity * od.UnitPrice
  select new OrderDescription
  {
      Product = od.Product.ProductName,
      Quantity = od.Quantity,
      ShipperName = o.Shipper.CompanyName,
      Total = total,
      UnitPrice = od.UnitPrice,
      SupplierName = od.Product.Supplier.CompanyName
  };
return orderDetails;


Using Lambdas

I mentioned earlier that I'm a big fan of lambdas when a particular query is reasonable.  However, they can get out of control.  The fairly straightforward LINQ query shown above gets pretty nasty when switching to lambdas since the joins require identifying the primary, foreign keys and fields to select.  This is lambda overkill....there are too many => characters in there for me, but it matches up with the LINQ query shown above pretty well.

public override IEnumerable<OrderDescription> GetOrderDetails(int orderID)
{
    NorthwindDataContext db = this.DataContext;
      IEnumerable<OrderDescription> orderDetails =
        db.Orders.Where(order => order.OrderID == orderID).
        Join(db.Shippers, o => o.ShipVia, s => s.ShipperID, 
          (o, s) => new { o.OrderID, ShipCompanyName = s.CompanyName }).
        Join(db.OrderDetails, o => o.OrderID, od => od.OrderID, 
          (o, od) => new {o.ShipCompanyName, od.ProductID, od.Quantity, od.UnitPrice }).
        Join(db.Products, od => od.ProductID, p => p.ProductID, 
          (OrderDetails, p) => new { OrderDetails, p.ProductName, p.SupplierID }).
        Join(db.Suppliers, p => p.SupplierID, s => s.SupplierID, 
          (OrderData, s) => new { OrderData, SupplierName = s.CompanyName}).
        Select(o => new OrderDescription
        {
            Product = o.OrderData.ProductName,
            Quantity = o.OrderData.OrderDetails.Quantity,
            ShipperName = o.OrderData.OrderDetails.ShipCompanyName,
            Total = o.OrderData.OrderDetails.Quantity * o.OrderData.OrderDetails.UnitPrice,
            UnitPrice = o.OrderData.OrderDetails.UnitPrice,
            SupplierName = o.SupplierName
        });
    return orderDetails;
}

By leveraging relationships in the object model generated by the LINQ to SQL Designer you can simplify this query a lot.  Here's an example of doing that (thanks to Dug for commenting and posting the refactored version):

public override IEnumerable<OrderDescription> GetOrderDetails(int orderID)
{
       NorthwindDataContext db = this.DataContext;

       IEnumerable<OrderDescription> orders =
         db.Orders.Where(order => order.OrderID == orderID).
         Join(db.OrderDetails, o => o.OrderID, od => od.OrderID,
         (o, od) => new { ShipCompanyName = o.Shipper.CompanyName, 
                          od.ProductID, 
                          ProductName = od.Product.ProductName, 
                          Quantity = od.Quantity, 
                          UnitPrice = od.UnitPrice, 
                          SupplierName = od.Product.Supplier.CompanyName }).

                         Select(o => new OrderDescription
                         {
                             Product = o.ProductName,
                             Quantity = o.Quantity,
                             ShipperName = o.ShipCompanyName,
                             Total = o.Quantity * o.UnitPrice,
                             UnitPrice = o.UnitPrice,
                             SupplierName = o.SupplierName
                         });
       return orders;
}


Using LINQ with Stored Procedures

This is my favorite technique.  While LINQ makes it easy to query against a database without embedding inline SQL into C# or VB.NET, using pure LINQ code still doesn't provide the same level of security that stored procedures can provide, requires that SQL be generated dynamically from LINQ expression trees and can complicate application maintenance down the road in my opinion.  To call the stored procedure shown at the beginning of this post using LINQ to SQL techniques you can use the following code once the stored procedure has been drag and dropped onto the LINQ to SQL designer surface.  This code is simple and easy to maintain.  Plus, I can filter the results even more by using LINQ or by adding lambdas onto the ap_GetOrderDetailsByOrderID() method if needed.

public override IEnumerable<OrderDescription> GetOrderDetails(int orderID)
{
    IEnumerable<OrderDescription> orderDetails = DataContext.ap_GetOrderDetailsByOrderID(orderID);
    return orderDetails;
}

Ultimately it all comes down to personal preference.  Having worked through many LINQ, lambda and stored procedure queries I'll be sticking with LINQ to SQL with sprocs since the code is squeaky clean.  I have a few friends who prefer using inline LINQ as shown in the first example and we've argued the pros and cons of each technique back and forth.  The beauty of it all is that we get to use what we want and have multiple options to choose from!

I'll post the demo code I've been working on soon so those who are interested in getting into LINQ, lambdas and LINQ with sprocs can see how each technique can be used in an n-tier application architecture.

 

 

Posted on Sunday, February 17, 2008 at 10:43AM by Registered CommenterDan Wahlin in , , , | CommentsPost a Comment | EmailEmail | PrintPrint

C# 3.0 Features: Extension Methods

.NET 3.5 is out which means all of the great features available in C# 3.0 are available to use now.  Here's a quick list of the main language enhancements available in C# 3.0:

  • Object Initializers
  • Automatic Properties
  • Extension Methods
  • Anonymous Types
  • Lambda Expressions
  • LINQ
  • Collection Initializers

    Extension methods allow existing classes to be extended without relying on inheritance or having to change the class's source code.  This means that if you want to add some methods into the existing String class you can do it quite easily.  Here's a couple of rules to consider when deciding on whether or not to use extension methods:

    • Extension methods cannot be used to override existing methods

    • An extension method with the same name and signature as an instance method will not be called

    • The concept of extension methods cannot be applied to fields, properties or events

    • Use extension methods sparingly....overuse can be a bad thing!

    Here's an example of creating an extension method in C# that adds a RemoveNonNumeric() method to the String class.  Notice that the class is defined as static as well as the extension method itself.  The "this" keyword in the parameter signature tells the compiler to add the extension method to the String class since "string" follows the keyword.

    namespace StringExtensions
    {
        public static class StringExtensionsClass
        {
            public static string RemoveNonNumeric(this string s)
            {
                MatchCollection col = Regex.Matches(s, "[0-9]");
                StringBuilder sb = new StringBuilder();
                foreach (Match m in col)
                    sb.Append(m.Value); 
                return sb.ToString();
            }
        }


    Here's an example of how the extension method can be used.  You'll see that the namespace for the extension method class is imported.  From there, the compiler treats the RemoveNonNumeric() method as if it was originally part of the standard System.String class. 

    using StringExtensions;
    


    .... string phone = "123-123-1234"; string newPhone = phone.RemoveNonNumeric();

  • Update:  Although the overall point of the post was to simply show how to create extension methods, Andrex posted a more efficient way to remove non-numeric characters for those that may actually need that specific functionality (I'll admit I was just throwing something out there :-)).  Thanks for commenting Andrex!

    public static string RemoveNonNumeric(this string s)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.Length; i++)
            if (Char.IsNumber(s[i]))
                sb.Append(s[i]);
        return sb.ToString();
    }
    del.icio.us Tags: ,

     

    Posted on Friday, January 25, 2008 at 02:15PM by Registered CommenterDan Wahlin in , | CommentsPost a Comment | EmailEmail | PrintPrint

    New Video: Integrating Silverlight and ASP.NET AJAX

    I gave a talk at Desert Code Camp toward the end of 2007 that discussed how Microsoft's Silverlight product could be integrated with ASP.NET AJAX to dynamically display albums obtained from an Amazon.com Web Service.  It's taken awhile to get the video posted, but it's now available.  The audio in the room wasn't great since no microphone was used so you may need to crank it up a bit. 

    Slides and code shown in the video can be downloaded below:

  • PowerPoint Slides Download

    Integrating Silverlight and ASP.NET AJAX (57 minutes)

    Click here to view in Windows Media Player (right-click and you can save the file)

     

    Posted on Sunday, January 20, 2008 at 11:48AM by Registered CommenterDan Wahlin in , , , , , | CommentsPost a Comment | EmailEmail | PrintPrint
  • Got Code? .NET Framework Library Source Code Released

    If you've ever wanted to step into the .NET framework library classes as you're debugging your project then you'll be happy to know that Microsoft has released the .NET Framework library source code.  Step in and out of various framework classes, ASP.NET controls, plus more.  Read more about it on Scott Guthrie's blog:

    http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx

    Posted on Wednesday, January 16, 2008 at 06:20PM by Registered CommenterDan Wahlin in | CommentsPost a Comment | EmailEmail | PrintPrint

    Upcoming .NET Courses in 2008



    I've had several people here in the Phoenix area and others I've met at ASP.NET Connections conferences ask when I'll be teaching specific .NET classes in 2008 and my standard reply has been "I'm not sure at this point".  We have things scheduled out past June now so here's the information for those who are interested.  Most of the classes listed are 5 days aside from the First Look at Visual Studio 2008 (1 day) and ASP.NET AJAX Programming (3 days).

    The schedule is of course subject to change, but it's what I have at this point.  If you have any questions about any of the courses feel free to contact me through my blog.

    Posted on Thursday, January 10, 2008 at 09:49PM by Registered CommenterDan Wahlin in , , , , , , , | CommentsPost a Comment | EmailEmail | PrintPrint

    Computers for Kids

    UPDATE:  Thanks to all those who bid on eBay.  The auction is over now.

    Interface Technical Training (my excellent employer) and AZGroups.com are auctioning off two training certificates on eBay this holiday season.  All of the proceeds from the auction will be used to purchase computers for kids who would not have access to a computer otherwise.  The certificates are valid for any training class at Interface throughout 2008 (which is located in Phoenix, AZ).  If you or your company are looking for .NET programming, Microsoft Systems, or Cisco training please take a look at the auctions on eBay since it's all going to a great cause.   

    Posted on Saturday, December 15, 2007 at 08:58AM by Registered CommenterDan Wahlin in | CommentsPost a Comment | EmailEmail | PrintPrint

    ASP.NET 3.5 Extensions Preview Released

    For those of you that like to stay on top of the latest technologies, Microsoft just released the ASP.NET 3.5 Extensions Preview today which provides the following new functionality (quoted from the http://www.asp.net Website):

    ASP.NET MVC

    ASP.NET MVC provides model-view-controller (MVC) support to the existing ASP.NET 3.5 runtime, which enables developers to more easily take advantage of this design pattern. Benefits include the ability to achieve and maintain a clear separation of concerns, as well as facilitate test driven development (TDD).

    The ASP.NET MVC Toolkit provides HTML rendering helpers and dynamic data support for MVC.

    ASP.NET Dynamic Data

    ASP.NET Dynamic Data helps developers build a fully customizable, data-driven app quickly. It provides a rich scaffolding framework that allows rapid data driven development without writing code, yet it is easily extendible using the traditional ASP.NET programming model.

    ASP.NET AJAX

    New additions to ASP.NET AJAX include support for managing browser history (Back button support).

    ADO.NET Entity Framework

    ADO.NET Entity Framework is a new modeling framework that enables developers to define a conceptual model of a database schema that closely aligns to a real world view of the information. Benefits include easier to understand and easier to maintain application code that is shielded from underlying database schema changes.

    ADO.NET Data Services

    ADO.NET Data Services provide new services that find, manipulate and deliver data over the web using simple URIs. Benefits include an easy and flexible way to access data over the web, while enabling the separation of presentation and data access code.

    Silverlight Controls for ASP.NET

    You can integrate the rich behavior of Microsoft Silverlight into your Web application by using two new ASP.NET server controls: a MediaPlayer server control that enables easy integration of media sources such as audio (WMA) and video (WMV) into your Web application, and a Silverlight server control that allows an ASP.NET page to reference both XAML objects and their event handlers.

    If you're still trying to get your head around new features released in Visual Studio 2008 and .NET 3.5 (and who isn't since they just came out) then this new preview release may really make your head swim.  We're all in that boat though. :-)  There's a lot of new things to look into and get to know that can significantly enhance developer productivity which is the ultimate goal.

    Posted on Sunday, December 9, 2007 at 11:20PM by Registered CommenterDan Wahlin in , , | CommentsPost a Comment | EmailEmail | PrintPrint

    .NET Framework 3.5 Common Types and Namespaces Poster

    I recently came across a new poster Microsoft released that provides a nice view of common types and namespaces in the .NET Framework 3.5.  You can download a PDF version of the poster here.

     

    Posted on Wednesday, November 14, 2007 at 11:27AM by Registered CommenterDan Wahlin in | Comments Off | EmailEmail | PrintPrint