donuts
Skip Navigation

You Can Have Your Dogfood and Eat It Too "Dogfooding" is a term to used to describe a company using its own product or, essentially, practicing what you preach.

Get the latest web news, tips & tricks in your inbox. We promise never to spam you or sell your email address.

Posted by dave on - Read

You Can Have Your Dogfood and Eat It Too

"Dogfooding" is a term to used to describe a company using its own product or, essentially, practicing what you preach. Early last week, several members of the Aztek Development Team had the opportunity to travel to DogFoodCon in Columbus. This Microsoft-centric conference had everything from Azure to Xamarin; focusing on the .NET technology stack and the tools they've developed to assist customers with their products.

The conference started on a high note, when Byron Tardiff, Azure Program Manager, flew in from Redmond to talk to us about the usability and scale of Azure Websites. Oh, and he also demoed, for the first time in public, a migration tool to move web applications hosted on Windows Server 2003 environments to the cloud; a very cool exclusive!

 

After each session you could spot an orange Aztek t-shirt in the hallway, faces lit up with new ideas. We were already dreaming up some big changes back at the office after the day one keynote.

Whether it was sessions like, 'World War D! Surviving the Apocalypse' by Brett Whittington that stressed the importance of disaster recovery plans (and testing those plans), or an introductory talk on Xamarin.Forms by Eric Polerecky, everyone at DogFoodCon was knee deep in Microsoft technologies.

Eric and his team even went as far as to learn a new tool in Xamarin just so they could continue using Microsoft .NET for their iOS development, much like the Aztek team has this year.

The organizers of DogFoodCon did a great job ensuring the session list was a hit, everyone was engaging and having a good time (there was an excellent game night after day one, where Aztek's Mike Hagesfeld set the Pac-Mac high score).

We all took in so much information over those two days that we cannot possibly keep it all to ourselves, and we would like to share some of our notes and takeaways with you...

Overall Conference Notes

  • Generally a very good conference
  • A good balance between general overview presentations and more specific, detailed example work
  • Learned a lot about some new (and new to me) technologies, as well as further expansion on some stuff I have been using - BIML, AngularJS, VS2013, etc.
  • Generally very good presenters - good energy, knowledgeable

Mongo.Baseball - David Hoerster

  • Mongo is a document database (i.e. not relational like SQL Server)
  • Mongo issues JSON documents, which are like relational tables

Related Apps

  • MongoDB integrates Mongo with Visual Studio and is available in NuGet - currently free
  • Robomongo is a UI for Mongo - currently free

The key difference between document DBs and relational DBs is piping.

  • Document DBs allow you to "pipe," or stage, your calls, so each function returns a staged dataset on which you apply the next function, rather than blackboxing the work
  • Once an operation completes, it passes the staged data to the next operation

Implementing Mongo for C#

  • Mongo fro C# does have entity types and allows LINQ calls, BUT these occur on the client and eliminate the advantage of using a document DB
  • Instead you needs to use Bson, and create a separate BsonDocument for each call
  • This implements the piping and ordering, but can result in ugly multi-tiered calls

Mongo has calls that relate closely to SQL/LINQ calls: $project = select, $match = where, etc.

There is no "join" operation, but you can pull in a record/records from a needed document, then use those values in your BsonDocument calls to another document.

Add Some DDD To Your ASP.NET MVC, OK? - Steve Smith

DDD = Domain Driven Development

  • In DDD, software models to the customer's understanding (speaking in "items," "carts," and "sizes" rather than "tables" and "fields")
  • DDD breaks complexity to manageable pieces
  • The key to and of DDD: ubiquitous language
    • Everyone using the same words for the same things, but within the bounded context (i.e must be the same within this application, not between applications)
    • That is, a "customer" must always be the same thing within Application A, but may be something very different within Application B

Key terms

  • Domain expert: the person who understands the application, and what it is trying to solve

  • Problem domain: what needs to be solved
  • Core domain: where the actual problem solving takes place

Despite unique modelling between application, you can use models between applications.

  • The anti-corruption layer manages entities that are shared between bounded contexts
  • For example, the meaning of "customer" is very different for a shopping app and a billing app, but an ACL can communicate about them between the two

"Aggregates" associate sub-entities to their parents so sub-entities can't be directly accessed.

  • For example, if you have OrderItems associated with Orders, an aggregate makes sure you cannot directly access an Order's OrderItems without going through the Order (the OrderItems essentially do not exist outside of the realm of their owning Order)

Value objects - defined by attributes, as opposed to entities, which exist apart from their attributes.

  • For example, the color Red exists only in its redness, and is the same as all Red, whereas a person named Steve Smith is different than another person who shares the same name attribute of Steve Smith

Avoid overuse of primitives - create new value objects that check for requirements.

  • Example: don't use a string for an email address, since there are specific properties for an email address that are not shared amongst all strings
  • Other example: a date range can be an object, as opposed to simply reusing code to check start and end dates

Domain Events - notify someone or something that something happened.

SignalR - a new technology that communicates with browser and can be used to push notifications.

  • This can be integrated with domain events, so when something within the domain happens, it triggers a notification, rather than waiting for an event.
  • Example: logout after a time, without waiting for an event to take place

Working with BimlScript to Ease and Automate Your SSIS Development - Jeff Mlakar

  • Most useful presentation I heard at the talk
  • Allows cross-VisualStudio development of SSIS packages
  • Can be developed in BIDS (Business Intel Dev Studio)
  • Business Intelligence Markup Language
  • BIDSHelper - on CodePlex
  • BimlScript lets you dynamically generate Biml using C#
  • BIDSHelper lets you generate Biml in BI package, then create package from Biml
  • Biml Structure - parallels SSIS
    • Connections
    • Packages
      • can be multiple
      • Constraint Mode = linear or parallel
  • Tasks
    • executeSQL
      • DirectInput for actual SQL
  • Dataflow
    • Tranformations
      • source
      • dest
      • assumes full table mapping, but can map columns
  • BimlScript - comes with BIDSHelper
    • <# C# CODE #>
    • VS does not recognize biml, so squiggles, but there is a Check for Errors
    • <#= VALUES #>
    • RootNode = already generated biml (can combine biml files)
      • goes through tiers
      • can set tier <#@ template tier="N"#>
      • executes tiers 0,1,...N
    • Using directive: <#@ import Namespace.Name #>
    • DLL Includes: <#@ assembly name="C:\dir\file.dll"#>
    • Template can also include language (default is C#)
    • Can dynamically get through source/dest data
      • To add method: <#+
      • <#+
      • list<x> GetListX()
      • {
      • code
      • }
      • #>
  • Cool stuff
    • Can create files used by all packages, e.g. file with tier = 0 with connection info
    • BIDSHelper has options to set for cut/paste issues
    • RootNode.GetBiml returns all Biml generated in files you are running
      • Is run on Check For Errors to get full Biml before running
    • Suggested Naming Convention: N_FileName (N = tier #)
  • Can't reverse engineer existing SSIS to Biml
  • Varigence.Hadron.CoreLowerer.SchemaManagement
    • Gives: conn = RootNode.DbConnections["source"]
    • dbInfo = conn.ImportDb(...) gives TableNodes, etc.
    • table.Columns, column.GetBiml() gives Biml column definition
    • table.GetColumnList() to get full column list
    • table.GetDropAndCreateDdl() for dynamic drop & create
    • foreach (var col in table.Columns) if column.DataType = DbType.AnsiString), etc.

Getting Started with AngularJS + WebApi - Eric Wise (@swcguild)

  • Excellent presentation - good energy, lots of good information
  • Single page apps - multiple views, no full postbacks
  • Get angularjs from nuget - Route and Core (one main package has EVERYTHING)
  • Bundling - add core before route to avoid problems
  • @scripts.render(..) for bundles
  • Angular
    • ng-app attribute for a control - this container uses angular
    • ng* = angular command
    • ng-model="propname"
      • anywhere it finds {{propname}} it will use that value
    • ng-init="modelname=XXX" (e.g. "modelname=[val1,val2,val3]")
    • ng-repeat="model in modelname" pulls out val1, val2, val3
      • use on attached element (i.e. <ul>
      • <li ng-repeat="val in modelname">{{val}}</li>
      • </ul>
    • can use filter:modelname using otherwise established modelname
      • (possibly can filter on field with .fieldname)
    • ng-controller="ControllerName"
    • ng-view - says this is where to put my view snippet
  • Controllers
    • contain calcs and business logic
    • $scope transports between controller and view
    • create script function ControllerName($scope)
  • Modules
    • Modules contain routes contain controllers and views
    • Name ngapp with module name (ngapp="moduleName")
  • Routes
    • declare with route (angular.module('moduleName',['ngRoute'])
    • function ($routeprovider)
    • .when('/Route1') controller = 'ControllerName' templateUrl='Page'
    • ng-click - on anything, ties to desired function
    • in controller, write needed function: $scope.functionName = function()
    • to add: $scope.modelName.push({val1='x', val2='y'})
  • Factories
    • moduleName.factory('factoryName',function($http) {
    • var factory = {};
    • factory.functionName = function () {}
    • }
    • Check code from here on in :)
  • Get Angular Batarang for showing aangular scope - chrome plugin

Photo Credit: "Dogfooding" by DivIQ

 

Search this site