Matthew Podwysocki's Blog

Architect, Develop, Inspire...

  • IoC and the Unity Application Block

    Update:  Fixed code changed from CTP and More in the series:


    As many people who read this would know, I'm a big fan of IoC containers, more in particular Castle Windsor and StructureMap among my favorites.  Anyhow, lately, I've been playing with the Unity Application Block from Microsoft Patterns & Practices (P&P).  Very recently, Grigori Melnik, the product manager for EntLib 4.0 and the Unity Application Block announced the February 2008 Unity CTP.  Anyhow, it's been an active topic on the altdotnet list as well lately as noted here.

    Basic Overview

    If you're not familiar with the Unity Application Block, it was formerly the Dependency Injection Application Block.  The application block itself is built upon the next version of ObjectBuilder. For a good overview of ObjectBuilder, check out Chris Tavares's blog on the Deconstructing ObjectBuilder series:
    Back History

    I don't think it's any secret to anyone that many people hated the original implementation of ObjectBuilder.  I used it mostly in Composite Application Block (CAB) applications, but as well I've played with a few samples, enough to know it's too poorly documented to use in any type of system. 

    Below, I have a code sample of the original ObjectBuilder approach to build a singleton instance of a Logger object:
     
    Builder builder = new Builder();
    Locator locator = new Locator();

    // Create lifetime container for holding singletons
    ILifetimeContainer lifetimeContainer = new LifetimeContainer();
    locator.Add(typeof(ILifetimeContainer), lifetimeContainer);

    // Set my singleton policy for creating my logger
    builder.Policies.Set<ISingletonPolicy>(new SingletonPolicy(true), typeof(Logger), null);

    Logger logger = builder.BuildUp<Logger>(locator, null, null);

    It's not the most fun code to write, nor was it very well documented.  David Hayden, EntLib guru extraordinaire also had issues with it as noted here

    Another criticism lied in the fact that it was used in the EntLib, so it was hard for those to use another DI framework in its stead.  One of the big reasons behind ALT.NET was that the community wanted to help drive openness within Microsoft in terms of allowing third-party products to integrate fully within Microsoft products. 

    Since then the EntLib team announced that they would open up a bit, but also, they were revamping ObjectBuilder as well, and now packaging it under the Unity Application Block.  This of course was met with skepticism from such folks as Jeremy Miller (StructureMap), and Ayende (Windsor/Bindsor contributor).  Of course to say, Ayende's objection was around the duplication of effort seen with Microsoft and the Open Source Community.  See MSTest versus xUnit.NET versus MbUnit versus NUnit as an example of this.  Jeremy Miller saw this as at last some openness within the P&P team, and I'd have to agree that they are consulting the outside community, which is great to see.  It's great to see that P&P and others are actively involved with ALT.NET and the outreach efforts in the community.  Others are a bit concerned because of many shops won't consider the other products such as StructureMap, Spring.NET, Windsor because Microsoft has an offering instead even though the others may be a bit more feature complete.

    Taking it for a Test Spin

    So, now that I got that other stuff out of the way, let's take things for a quick test spin.  Let's walk through code how to do a basic setup using Dependency Injection with a constructor injection:

    namespace UnitySample
    {
        public interface ILogger
        {
            void Log(string value);
        }

        public class ConsoleLogger : ILogger
        {
            public void Log(string value)
            {
                Console.WriteLine(value);
            }
        }

        public interface ICustomerTasks
        {
            void SaveCustomer(Customer customer);
        }

        public class CustomerTasks : ICustomerTasks
        {
            private ILogger logger;

            public CustomerTasks(ILogger logger)
            {
                this.logger = logger;
            }

            public void SaveCustomer(Customer customer)
            {
                logger.Log("Customer Saved");
            }
        }

        public class Customer
        {
            public string FirstName { get; set; }

            public string AccountNumber { get; set; }
        }

        class Program
        {
            static void Main(string[] args)
            {
                IUnityContainer container = new UnityContainer()
                    .RegisterType<ILogger, ConsoleLogger>()
                    .RegisterType<ICustomerTasks, CustomerTasks>();

                ICustomerTasks tasks = container.Resolve<ICustomerTasks>();
                tasks.SaveCustomer(new Customer());
            }
        }

    And as you can see from this, on the console window, you should receive a "Customer Saved" message.  So, that's using constructor injection.  Instead, we could have easily done this through property setter injection which is another popular way of doing injection.  Let's rewrite it just a bit to do that:

    namespace UnitySample
    {
        public class NullLogger : ILogger
        {
            public void Log(string value)
            {
                // Do nothing
            }
        }
     
        public class CustomerTasks : ICustomerTasks
        {
            private ILogger logger = new NullLogger();

            public void SaveCustomer(Customer customer)
            {
                logger.Log("Customer Saved");
            }

            [Dependency]
            public ILogger Logger
            {
                get { return logger; }
                set { logger = value; }
            }
        }
    }

    And if using the same program.cs as above, it should work just the same.  These of course are really simple samples, but what most basic DI frameworks do.  This is pretty easy to set up so far in my adventures.  Now you could do like the other DI frameworks and be heavy on the XML configuration as well.  It's not hard to set this up either.  Below is a basic example of this XML configuration file:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="unity"
                 type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
                       Microsoft.Practices.Unity.Configuration" />
      </configSections>
      <unity>
        <containers>
          <container>
            <types>
              <type type="UnitySample.ILogger,UnitySample"
                    mapTo="UnitySample.ConsoleLogger,UnitySample" />
              <type type="UnitySample.ICustomerTasks,UnitySample"
                    mapTo="UnitySample.CustomerTasks,UnitySample" />
            </types>
          </container>
        </containers>
      </unity>
    </configuration>

    Now that we got the XML config done, let's then reimplement our program.cs to handle this:

    namespace UnitySample
    {
        class Program
        {
            static void Main(string[] args)
            {
                IUnityContainer container = new UnityContainer();

                // Load from config file
                UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
                section.Containers.Default.GetConfigCommand().Configure(container);

                ICustomerTasks tasks = container.Resolve<ICustomerTasks>();
                tasks.SaveCustomer(new Customer());
            }
    }


    Wrapping it Up

    So, as you can see, it's pretty easy to get started.  This of course is the 1000 ft overview of what it can do.  Competition is a good thing when it comes to creating these frameworks.  Choice is a wonderful thing...  I am especially encouraged by P&P's openness to the community, as well as some in the community to give back and give feedback to Microsoft for these frameworks.  Without one, the other cannot become stronger.  I'm encouraged from the early signs of Unity and I've enjoyed the samples and playing with it as much as I have.  Give it a try and better yet, give feedback to the team...

    Until next time...

    kick it on DotNetKicks.com

  • ALT.NET Seattle Registration and Mispronouncing My Last Name

    Just a reminder that ALT.NET Open Spaces, Seattle registration is still open, although we are sold out at the moment, we are taking stand-by's just in case some drop out.  So, if you hadn't registered with us, go ahead and do so, and don't let the sold out scare you.  Just keep in mind that you may not be selected, so I wouldn't make concrete plans if you are traveling to get there.

    I'm hoping to finish up about 5-6 posts that have been sitting around since last week on F#, the Unity Application Block, Mocking versus Stubbing and so on.  Hopefully today I'll get some of that done, so stay tuned.  That and there is a DC ALT.NET meeting this Wednesday as well.

    So, I know this is a random post, but if you caught over the weekend, the "This Week on Channel 9: Feb 15 with Scott Hanselman!" episode on Channel9, you may have noticed I was mentioned around minute 11, and it was a struggle to Brian Keller on how to pronounce my last name.  Don't worry about it, people, it happens all the time, and I usually let people struggle with the first part for a while before I have to hop in.  It's a definite way of telling who knows me and who doesn't...  It's like "Podwa Podwe Probably not gonna work here anymore, that's for sure!" from Office Space.

    kick it on DotNetKicks.com

  • Resharper 4.0 Nightly Builds Now Released

    A recent announcement was made on the altdotnet mailing list that made me jump for joy today.  Ilya Ryzhenkov and the great folks at JetBrains have published the nightly builds for Resharper 4.0.  The download for this can be found here and you might want to read the release notes here.  It's important to note that the LINQ syntax is still not supported yet.  As with any product in nightly builds, please use with caution, but download it and play with it today!

    kick it on DotNetKicks.com

  • RockNUG Meeting - ASP.NET MVC + Updates

    Tonight, put on the DVR and come out to the Rockville .NET Users Group (RockNUG) for a presentation by Jeff Schoolcraft on ASP.NET MVC

    The timing of course couldn't be more appropriate as ScottGu has recently posted about the ASP.NET MVC Framework Update in which he talks about a few pain points I know I've been having as well as others such as:

    • Can be deployed in partial trust in the \bin directory
    • Improved routing features and infrastructure
    • Test wizard now supports and probably one of my favorite features
      • MSTest
      • NUnit
      • MbUnit
      • XUnit.NET
    • Removing ControllerAction Attribute requirement from controllers, instead all public members will be controller actions.  Another nice thing to remove a pain point
    • Filter Support for Controllers and Action methods
    • HTML Helpers now built in
    • And so on...
    The plan is to release a new preview at MIX08, so it should be pretty exciting to get the hands on the new bits.

    Phil Haack has also covered this with his comments on ASP.NET MVC Update and Blocking Direct Access to Views in ASP.NET MVC.

    Anyhow, back to the original intent of the post, the details are as follows:

    An Introduction to ASP.NET MVC
    presented by Jeff Schoolcraft

    Come walk with me as I lead you on a gentle, relaxed tour of the ASP.NET MVC Framework. I'll demystify the forest of three letter acronyms. Then we'll take a journey through the hall of ancestors--and cousins--to discuss some influences and other players in the MVC space. We'll end up at the Grove of Hello World and, like habitat for softwarity, we'll build a demo application. Along the way we might run into some tangential trolls, but we'll cross that bridge when we come to it.

    Jeff Schoolcraft is the founder of The Queue, Incorporated; a consulting shop that writes software and helps write software better. He has been in the .NET space from nearly the beginning and is still, mostly, writing web applications in C#. He tries to organize a couple Code Camps a year and is hoping to find a developer community that isn't over an hour away. When he's not immersed in code he enjoys spending time with his wife and two daughters.

    Time:
    Wednesday, February 13, 2007 6:30-9:00 PM

    Location:
    Montgomery College, Rockville
    Humanities Building - Room 103
    Rockville, MD
    Click here for details....

    Come and support the organization if you're in the area!  Should be a great session!

    kick it on DotNetKicks.com

  • ALT.NET Open Spaces, Seattle Sold Out!

    Within a mere set of hours, ALT.NET Open Spaces, Seattle is officially sold out!  Don't worry if you have a registration code, you still have plenty of time to register.  We have a wait list if you still wish to attend, so don't let that discourage you at this point.    We had a great reaction and I'm really excited to see such a great turnout.  As you can notice from our participants page, and it will be growing of the people with registration codes, but we have such people as Jim Shore, Open Source folks, community folks (too many to mention, and if I missed your name I apologize) and Microsoft folks such as Scott Guthrie, Scott Hanselman, Brad Abrams, Phil Haack, and Chris Sells.  Stay tuned for future updates to all those who registered.  Going to be a great time!

    kick it on DotNetKicks.com

  • ALT.NET Open Spaces, Seattle Registration Open

    Darn it, Dave beat me to it here

    Anyhow, yes, as noted, the registration for ALT.NET Open Spaces, Seattle is now open and you can find it here.  This site requires OpenID in order to register with just your name and email address.  Feel free to use any of these OpenID servers on the OpenID Servers PageMyOpenID or Versign's PIP both worked for me, so you should have no problem.

    We have already 50 pre-invites, so that makes about 100 for general registration right now.  It's going to be a great crowd and a lot of big names.  We've been working very hard on this effort and it's going to be a great time with lots of events and great topics to discuss.

    The hotel logistics have been worked out and information can be found on the site.  So, check it out, and register today, and be there!

    kick it on DotNetKicks.com

  • Adventures in F# - F# 101 Part 1

    Update:  Added more topics

    In some previous posts, I pointed you to a bunch of links to help get me started.  I'm still working on some more thorough examples, but this time around I'm going to walk you through the F# 101 much like I did with Spec#.  What we first need to understand is the key differences between imperative and functional programming. 

    I've really enjoyed Robert Pickering's book Foundations of F# and Don Syme's Expert F# book as they both give a good overview of not only the language, but the uses.  It's a lot for some stuck in the imperative world to think about functional programming, but these books do their job well.

    So, today I'd like to cover the following topics:
    • Hello World Sample
    • #light
    • Functions == Values basics
    Hello World Example

    As I like to do with most languages, I know it sounds trite, but Hello World, especially in .NET languages is interesting, especially how they translate in IL through Reflector.  F# is especially interesting in this case as it is a functional language built on top of a imperative framework such as the CLI and C#. 

    So, let's walk through a simple example.  First, of course you need to have F# installed which can be found here.  Then go ahead and create a new F# project, which should be under the Other Project types.  By default, it will not give you any classes as part of your project.  So, go ahead and add an F# Source File.  It will give you the extension of .fs by default.  I went ahead and created a class called HelloWorld.fs.  Get rid of the default text that is in there, and it is plenty, and just put in the following code:

    #light

    print_endline "Hello World"

    As you can see from the simple example above, we've put in the #light directive.  I'll cover what that means shortly.  But anyways as you can notice it calls a default global function called print_endline.  I always like to look at what the code compiles to in Reflector to IL, so let's take a look at that.



    What's really interesting to see from the above, by default, it created the main function for us without us explicitly doing so.  Also, it notes that we are calling an OCaml function.  If you look through Reflector and the FSharp.Compatibility.dll, you'll notice it takes a few things from OCaml as its base.

    Where to Turn

    As always, if you have problems, the specification and the books help out well with this.  If you should get lost, the information F# specification is very good at defining the language and can be found here.

    Stay in the #light


    From the above example and many other examples you will see from me, you'll notice the #light directive at the top of every source file.  What this does is that it makes all whitespace significant.  This directive allows you to omit such things as begin, end, in and the semi-colon.  When defining functions and so on, you indent your code to make it fall under that scope implicitly by using that directive.

    Identifiers, Keywords and Literals

    In F#, it's important to realize that variables, aren't really variables, more like identifiers.  In pure functional programming, it's fundamental to understand that once a "variable" is assigned, it is immutable.  However, if using F# an imperative way of thinking, then it can be.

    To make a simple assignment, just use the simple let keyword such as this:

    #light

    let message =  "Hello World"
    printfn "%s" message

    One of these identifiers can be either either just a simple value, or even a function, since these functions are values as well.  I'll cover that more shortly in the next section. 
    #light

    let rec fib n = if n < 2 then 1 else fib (n-2) + fib(n-1)
    printfn "%i" (fib 10)

    I think this example went a little too far with adding recursion, but you get the point that it's pretty easy to define a function much as you would with any old "variable".  Also, you may note, I'm not returning anything from this function, but in fact I am returning the Fibonacci sequence that I asked for.

    If you also note the keywords, there are a lot of direct mappings from C# to F#, but it's also interesting that it has a list of reserved keywords for future use such as mixin.  Now, if we finally brought mixins to .NET, well, then I'm all for it.

    Of the types that exist in F#, the only ones to note that are completely different are:
    • bigint - Microsoft.FSharp.Math.BigInt
    • bignum - Microsoft.FSharp.Math.BigNum
    It's interesting to know that the .NET framework's BigInteger class is internal, yet these are publicly available.  Both of these are rational large integers just in case you need that kind of thing.

    Functions == Values?

    Once again, like I said above, functions and values are one in the same in the pure functional programming stance.  You noticed that in my functions, I'm not returning anything, nor is it imperative that you do so explicitly.  This boggles many of OO mindsets, I'm sure and there are a lot of things in FP that an OO person may have problems with.

    Let's walk through another simple function, but this time, we'll implement that main function and look at the results through Reflector.

    #light

    let rec fib n = if n < 2 then 1 else fib (n-2) + fib(n-1)
    let print x = printfn "%i" x

    let x1 = fib(10)
    let x2 = fib(20)

    let main() =
      print x1;
      print x2

    main()

    From the above sample, I created two functions, a recursive Fibonacci sequence function from above, and I also created a print function which calls the native printfn function which is a variation of the printf function with a newline at the end.  For those who are curious about what it looks like in Reflector, let's take a look, and this time in C#.  Instead of pasting a bunch of screenshots, it's much easier to paste it below the pieces we're interested in.

    fib function:
    public static int fib(int n)
    {
        if (n < 2)
        {
            return 1;
        }
        return (fib(n - 2) + fib(n - 1));
    }

    print function:
    public static void print(int x)
    {
        Pervasives.printfn<FastFunc<int, Unit>>(new Format<FastFunc<int, Unit>, TextWriter, Unit, Unit>("%i")).Invoke(x);
    }

    main function:
    public static void main()
    {
        print(get_x1());
        print(get_x2());
    }

    So, as you can see, it's doing much like we think it would be, as it fit everything into our HelloWorld class.  The more interesting pieces are how C# and F# functions differ.  It's just interesting to see how FP fits on top of an imperative programming framework.

    Next time, I'll cover more with functions such as Currying, Tuples, Recursion, Scopes and so on.  Plus I need to talk about the interop story here which is strong between F# and C# as well.  There's a lot to cover and quite frankly, it's making me stronger as well to go over this time and time again.

    Conclusion

    This is the first post in the series.  As you can see, I have plenty to cover in the next installment.  If you like the series and so on, subscribe and keep coming back.  Until next time...

    kick it on DotNetKicks.com

  • Adventures in Compilers - Building on the DLR

    So, I can admit, I've been on a bit of a kick with compilers and such after my posts on DSLs, Compilers and the Irony of it All and Lang.NET and Rolling Your Own.  Today is no different, but this time, I'm just intrigued by targeting the DLR instead of the CLR.   Thankfully there are a few great references that people are doing right now for these little adventures.  One day once I'm more finished with the deep dive into F#, I'll dig a little deeper.

    So, to get started, head on over to the IronPython download at CodePlex and let's get started.  The DLR doesn't compile down to MSIL, instead expression trees.  The DLR contains a set of expression trees that allow you to define variable assignments, functions, loops, if/then/else, and much more.  After making the DLR expression tree from the aforementioned pieces, the DLR handles the code.  This will be covered by Martin Maly in some of his posts.

    Building Your Own DLR Language Series

    Martin Maly from the Microsoft DLR team has started a series on building languages on top of the DLR.  The posts in the series are so far:

    • Building a DLR Language - ToyScript
      This post covers the basics of the ToyScript sample from the IronPython download.  This covers the tokenizer, parser and the Abstract Syntax Tree (AST).  This is the starter for the series.

    • Building a DLR Language - Trees
      This post covers that the ToyScript language generates not MSIL, but instead trees which the DLR then take care of the code generation.  This also covers the expressions that the DLR trees support

    • Building a DLR Language - Trees 2
      This is a follow-up to the previous post and covers the constructs for creating functions and lambdas. 

    • Building a DLR Language - Dynamic Behaviors
      This post covers dynamic behaviors, instead of the previous samples which covered static linked and strongly typed.  This sample covers arbitrarily adding two objects.

    • Building a DLR Language - Dynamic Behaviors 2
      This is a follow-up to the previous post on dynamic behaviors, and this time covers using the ActionExpression.  This time he digs into Reflector to show samples of the output.  Very cool stuff...

    • Building a DLR Language - Dynamic Behaviors 3
      In the final post so far in the series, it covers what happens when the DLR encounters a new runtime condition it hasn't seen and doesn't know yet how to handle.  These conditions are handled by Rules in the DLR sense.
    Building on the DLR

    Tomas Restrepo recently blogged about just that kind of adventure as well with some good posts recently.  Here are the ones so far:
    • Building On The DLR
      This is the first post in the series which gives an introduction to the basics and where to get started.

    • DLR Notes 1
      This post covers simple things such as declaring global and local functions and variables and the trials and tribulations.

    • DLR Notes 2
      This post is a rather long post about implementing function calls through Call Actions.  This includes such things as  call expressions,  IDynamicObject and ActionBinders

    • DLR Notes 3
      This is a follow-up which covers InvokeMember actions which are used to invoke instance members on .NET objects.
    Conclusion

    This is pretty exciting stuff as it has whetted my appetite for building dynamic languages.  My mind is still swimming with the possibilities of this, but to make one of these languages is simpler than ever.  Once again, I'll start taking that deep dive after I finish my F# kick, but I still thought I'd start gathering my resources now.

    Until next time...

    kick it on DotNetKicks.com

  • Software Transactional Memory and F#

    Since I have a rather long commute to and from work, I have the opportunity to get caught up on all sorts of podcasts and such.  Very recently, I listened to the DotNetRocks Episode 310 with Simon Peyton Jones on Haskell and Functional Programming.  It seems that Carl and Richard are definitely on a functional programming trip, and I think Scott Hanselman has joined the group as well with his shows on Hanselminutes.  Since I've been learning F# and such I thought this show was well worth a listen, and I was right.

    Simon Peyton Jones is currently working on a few things including the a Haskell compiler, Glasgow Haskell Compiler (GHC) and C--

    Haskell

    If you're not familiar with Haskell, it is a purely functional programming language, unlike F# which allows for imperative and functional programming in the same language.  The GHC is one of the more popular Haskell compilers out there today.  Much like every other language out there today, there are a couple, although inactive, Haskell .NET compilers out there including Hugs98 for .NET using the Hugs98 compiler, and Modrian using the GHC.

    Let's walk through a simple example of computing a factorial in one line:

    fac n = if n > 0 then n * fac (n-1) else 1

    As you can see from the above line, we create a function that keeps recursing itself until it hits 1. 

    Now, let's look at a simple version in the Hugs98 for .NET for a simple console application:

    main = do
      obj <- new "System.Object"
      x   <- obj # invoke "GetHashCode" ()
      print ("The hash code is: " ++ show (x::Int))

    Pretty slick actually...  Too bad they aren't being maintained anymore, especially with .NET 2.0 and beyond goodness.  But, if you're looking for more tutorials and such, go here for a brief demo from Simon himself.

    Software Transactional Memory (STM)

    One of the more interesting aspects of Simon's visit to DNR was talking about Software Transactional Memory (STM).  This has been one of Simon's projects at Microsoft Research and an interesting one at that.  STM originally came about back in the '80s, but only more practical now as many times it has failed in the past.  Think of STM being analogous to database transactions, but in shared memory for concurrent running programs.  The GHC has actually implemented this functionality and is pretty interesting.

    So, what does this offer us?  Well, with this scheme proposed in their paper, you can take two operations and combine them to be atomic.  In the past, it was unclear when and how they should attempt to re-execute the transaction should it fail.  So, in turn, Simon's group put in a retry keyword which uses a transaction log that determines the memory that was read and then automatically retries it and changes that piece of memory.  They also implemented the orElse keyword which brings an alternative in should the transaction fail the first time, then the alternative is run.

    You can read more about Simon's group's research paper here.

    STM in F#?

    So, this is really cool stuff, but can we have this in .NET?  Greg Neverov has indeed written a library called Software Transactional Memory for F# which is available on hubFS.  What's interesting is that the low level goo for the STM is actually written in C# using the Monitor class with method calls to Enter, Wait, Exit and PulseAll.  So, I guess you could call this library from C# as well to do concurrent programming, but that's more of F#'s gig.

    Here's a simple example using this:

    let enqueue queue item =
      stm { let! used = readTVar queue.used
            return! if used < queue.len
                    then stm { let! head = readTVar queue.head
                               do! writeTVar queue.a.[(head+used) % queue.len] item
                               return! writeTVar queue.used (used+1) }
                    else retry () }

    So, download it today and check it out.  There may be performance implications of using this code instead of just the standard Monitor.Enter and so on, but I've yet to check that out.

    Conclusion

    I barely scratched the surface once again on this and the possibilities.  You could easily imagine using this in heavy concurrent applications touching static data and shared memory.  A lot of these things give me the idea about the strength and power of F# and .NET languages as a whole.  .NET is rapidly evolving before our eyes and the possibilities of so many years ago with many languages using the same platform is really solidifying and each language has its purpose...

    Until next time...

    kick it on DotNetKicks.com

  • DC ALT.NET Site Now Up

    Well, after much trial and tribulation, we finally have our DC ALT.NET site up.  Thanks to Phil McMillan and Entropy Zero Consulting for hosting the site!  Right now it's a work in progress and I hope to have it more complete tomorrow.  As per usual with these kinds of groups, it's a wiki style and will be constantly changing with resources from our previous meeting, voting on the next topics at the next Open Spaces and places for sponsorship among other things.

    Meeting Announcement Redux

    Just a reminder about our third meeting of DC ALT.NET on February 20th at 7PM.

    The meeting this month will bring ALT.NET to Reston, Virginia and the Stelligent headquarters.  I want to thank Jay Flowers for offering his office as our get together.  The food and booze will be provided by Stelligent, so a big thanks to them!  Oh, and they are hiring if anyone is interesting (schilling off). 

    At our last meeting, CMAP hosted our event in which we discussed a lot of great topics.  You can read a wrapup of our last meeting here.  We're going to formalize things a little bit this time around and vote on topics for next time at this meeting so we can come prepared.  As a group, we're growing fast and learning a lot along the way.

    Looking for Sponsors

    As always, we're looking for sponsors for our events.  We bring a lot of passionate developers to your site and we feel we can bring a lot.  Sponsorship opportunities are always appreciated!

    Who We Are

    Are you a developer who always keeps an eye out for a better way? Do you look outside the mainstream to adopt the best practices of any development community, including Open Source, Agile, Java, and Ruby communities? Are you always looking for more elegant, more simple, more maintainable solutions? If so, then you might be an ALT.NET practitioner!
     
    This group follows the Open Space Technology model.  In Open Space, a facilitator explains the process and then participants are invited to co-create the agenda and host their own discussion groups.  So, we'll take a vote and present the topics.  We're in the pub-club mind occasionally, so it's not surprising to find us geeking out a bar...
     
    This model follows the four basic principles:

    • Whoever comes are the right people
    • Whatever happens is the only thing that could have
    • Whenever it starts is the right time
    • When it's over, it's over
    Topics

    Topics for discussion can include the following as well as others:
    • Model View Controller Pattern (ASP.NET MVC/MonoRail)
    • Inversion of Control (IoC) containers and Dependency Injection (Spring.NET/Castle Windsor/StructureMap)
    • Domain Driven Design
    • Design by Contract and Spec#
    • Continuous Integration
    • Agile
    Time and Location:
    Tuesday, February 20, 2008 7:00 PM

    Stelligent Incorporated
    Global Headquarters
    11495 Commerce Park Drive
    Reston, VA 20191

    Come, participate, and make your voice heard!  Come meet passionate developers like yourself in the active discussion.  Hoping for a great turnout...   If you haven't signed up for our list, go ahead and do that here.

    kick it on DotNetKicks.com