Tuesday, April 15, 2008
So I also made the a similar template with structuremap support included.

Wich looks something like this

Imports Nunit.FrameWork
Imports StructureMap

Namespace $NAMESPACE$
    ''' <summary>
     ''' A TestClass
      ''' </summary>
       ''' <remarks></remarks>
     <TestFixture()> _
     Public Class $CLASSNAME$
    
#Region " Setup and TearDown "
        ''' <summary>
         ''' Sets up the Tests
          ''' </summary>
           ''' <remarks></remarks>
         <Setup()> _
          Public Sub Setup()
                       StructureMapConfiguration.UseDefaultStructureMapConfigFile = False
                   StructureMapConfiguration.ScanAssemblies.IncludeTheCallingAssembly()
            End Sub

        ''' <summary>
         ''' Tears down the test. Is executed after the Test is Completed
          ''' </summary>
           ''' <remarks></remarks>
         <TearDown()> _
          Public Sub TearDown()
                ObjectFactory.ResetDefaults()        
             End Sub      
#End Region     

#Region " Tests "
                   ''' <summary>
         ''' A Test
          ''' </summary>
           ''' <remarks></remarks>
             <Test()> _
              Public Sub $Test_Name$()
           
               End Sub
#End Region

     End Class
End Namespace
And of course I also made an XmlFile so you can easily import it.

NunitTestFixtureWithStructureMapSupport.xml (2,44 KB)
4/15/2008 2:52 PM Romance Daylight Time  #    Disclaimer  |  Comments [0]  |  Trackback
I made a file template for resharper to make it eassier to create a TestClass

it looks like this.

Imports Nunit.FrameWork

Namespace $NAMESPACE$
    ''' <summary>
     ''' A TestClass
      ''' </summary>
       ''' <remarks></remarks>
     <TestFixture()> _
     Public Class $CLASSNAME$
    
#Region " Setup and TearDown "
        ''' <summary>
         ''' Sets up the Tests
          ''' </summary>
           ''' <remarks></remarks>
         <Setup()> _
          Public Sub Setup()
    
            End Sub

        ''' <summary>
         ''' Tears down the test. Is executed after the Test is Completed
          ''' </summary>
           ''' <remarks></remarks>
         <TearDown()> _
          Public Sub TearDown()
            
        End Sub      
#End Region     

#Region " Tests "
                   ''' <summary>
         ''' A Test
          ''' </summary>
           ''' <remarks></remarks>
             <Test()> _
              Public Sub $Test_Name$()
           
               End Sub
#End Region

     End Class
End Namespace
I also made an xmlFile so you can easily import it into Resharper.

NunitTestFixture.xml (2,15 KB)
.Net | Nunit | Resharper
4/15/2008 2:49 PM Romance Daylight Time  #    Disclaimer  |  Comments [0]  |  Trackback
 Monday, April 14, 2008
Sometimes we just add references and never use them or use them and then remove it all again. And sometimes it is hard to say which reference we don't use anymore. Well MS has provided us with a button that looks up the unused references and if it finds ione you can remove the unused references.

So how do we do it.

First we right clikc on our project and select properties.



Then we go to the tab references and click on the button Unused References.




This will open a dialog with either a list of unused references (see below) or nothing in it.




And now you can just click remove and the references will be gone.


4/14/2008 1:48 PM Romance Daylight Time  #    Disclaimer  |  Comments [0]  |  Trackback
Changing the targeted framework of a project in VB.NET 2008 with the Visual Studio IDE goes like this.

First we click right on the project name and choose properties.



Then we select the compile tab and click on the "Advanced Compile Options..." Button.



And last but not least we select the desired framework from the list "Target framework (all configurations)".





4/14/2008 1:32 PM Romance Daylight Time  #    Disclaimer  |  Comments [0]  |  Trackback
 Sunday, April 13, 2008
Now that I have StructureMap and RhinoMocks in my stack I sometimes need to look for VB.Net examples of how to do things, because sometimes translating them from C# is not all that easy.

This article has helped me mocking events.

4/13/2008 11:05 PM Romance Daylight Time  #    Disclaimer  |  Comments [0]  |  Trackback
After reading A post by Sergio Pereira I thought about translating his code to VB.Net because as usual all the cool things are written in C#.
So this piece
    using(StreamReader rd = File.OpenText("Data.txt"))  
{
string line = rd.ReadLine();
while(line != null)
{
DoSomething(line);
// do more stuff with the line text

//move on
line = rd.ReadLine();
}
}
Becomes

Dim rd As System.IO.StreamReader = System.IO.File.OpenText("Data.txt")
Using (rd)

Dim line As String = rd.ReadLine()
While (line IsNot Nothing)

dosomething(line)
' do more stuff with the line text

'move on
line = rd.ReadLine()
End While
End Using

and the next bit

    public static class FileUtil  
{
public static void EachLine(string fileName, Action<string> process)
{
using(StreamReader rd = File.OpenText(fileName))
{
string line = rd.ReadLine();
while(line != null)
{
process(line);
line = rd.ReadLine();
}
}
}
}

will translate in

Public Class FileUtil

Public Shared Sub EachLine(ByVal fileName As String, ByVal process As Action(Of String))
Dim rd As System.IO.StreamReader = System.IO.File.OpenText(fileName)
Using (rd)

Dim Line As String = rd.ReadLine()
While (Line IsNot Nothing)

process(Line)
Line = rd.ReadLine()
End While
End Using
End Sub
End Class

And we call that last piece of code like this

FileUtil.EachLine("Data.txt", AddressOf dosomething)

The doSomething method would look something like this

Private Sub dosomething(ByVal line As String)
        MessageBox.Show(line)
    End Sub


And that's it.



4/13/2008 9:59 PM Romance Daylight Time  #    Disclaimer  |  Comments [0]  |  Trackback
A little example of how xlinq can make life eassier on us. And the pitfalls on how to get it to work.

I have have an xml file named Translation_En.xml.

Translation_En.xml

<?xml version="1.0" encoding="utf-8" ?>
<FormType>
  <Vaccation>Vaccation</Vaccation>
  <Mission>Mission</Mission>
  <Holiday>Holiday</Holiday>
</FormType>


And then the class that will get the data and save it. Don't forget to set references to system.core, system.data.linq, system.xml and system.xml.linq.
Imports System.Linq

Public Class Translation
Private _Vaccation As String
Private _Mission As String
Private _Holiday As String
Private _Language As String

Public Sub New(ByVal Language As String)
_language = Language
End Sub

Public Property Language() As String
Get
Return _Language
End Get
Set(ByVal value As String)
_Language = value
End Set
End Property

Public Property Vaccation() As String
Get
_Vaccation = GetTranslation("Vaccation")
Return _Vaccation
End Get
Set(ByVal value As String)
SaveTranslation("Vaccation",value)
_Vaccation = value
End Set
End Property

Public Property Mission() As String
Get
_Mission = GetTranslation("Mission")
Return _Mission
End Get
Set(ByVal value As String)
SaveTranslation("Mission",value)
 _Mission = value
End Set
End Property

Public Property Holiday() As String
Get
_Holiday = GetTranslation("Holiday")
Return _Holiday
End Get
Set(ByVal value As String)
SaveTranslation("
Holiday",value)
_Holiday = value
End Set
End Property

Private Function GetTranslation(ByVal Element As String) As String
Dim _return As String = Element
Try
Dim _File As XElement = XElement.Load(GetFilename)
Dim _Element As IEnumerable(Of XElement) = From c In _File.Elements(Element) Select c
_return = _Element.Value.ToString
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Return _return
End Function

    Private Sub SaveTranslation(ByVal Element As String, ByVal value As String)
Dim _File As XElement = Nothing Dim _Element As IEnumerable(Of XElement) = Nothing Try _File = XElement.Load(GetFilename)
_Element = From c In _File.Elements(Element.ToString) Select c
_Element(0).SetValue(value)
_File.Save(GetFilename)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try End Sub
Private Function
GetFilename() As String
Return "Translation_En.xml"
End Function

 End Class
And now let me explain a bit further.
First of all this class has getters and setters but that is not important ;-)

The most iportant bit is the getranslation function.

this line gets the data from the file and puts it in an Xelement object
Dim _File As XElement = XElement.Load(GetFilename)

The next line takes out the Element we want. We don't need to specify the root element(a misstake I made the first time around.)

Dim _Element As IEnumerable(Of XElement) = From c In _File.Elements(Element) Select c

The last line just takes the value of the element and puts it in a string value.
_return = _Element.Value.ToString

So that is how we get data out of one element.

Now we want to update the file and that's what savetranslation is for, it is so easy to understand if you name your methods correctly.

Again we load the file and get the correct element

_File = XElement.Load(GetFilename)
_Element = From c In _File.Elements(Element.ToString) Select c

Then we set the first elements vale (since we only have one returned to us it has to be the first one).

_Element(0).SetValue(value)

And last but not least we save the file.

_File.Save(GetFilename)

Of course you could make this a lot better. And I will in a next episode.


.Net | linq
4/13/2008 8:36 PM Romance Daylight Time  #    Disclaimer  |  Comments [0]  |  Trackback
 Sunday, March 16, 2008
Time to use an Ioc (Inversion of Control) container like structuremap. Most if not all examples you find on the net are in C# but us VB.Net developers aren't imune for it either. So today I made my first project with structuremap. Lets' see how it goes. Thanks to Jeremy D. Miller for making this great product.

I used the atributes for this and not the external config file (aka: StructureMap.config).

I will demonstrate this by crating a Dal, A model and A view/presenter. Let's start with the Model

the interface

Namespace Model.Interfaces
    Public Interface IPerson
        Property Id() As Guid
        Property LastName() As String
        Property FirstName() As String
    End Interface
End Namespace

the implementation

Namespace Model
    Public Class Person
        Implements Model.Interfaces.IPerson

        Private _lastName As String
        Private _id As Guid
        Private _firstName As String

        Public Sub New()
            _id = New Guid
            _firstName = ""
            _lastName = ""
        End Sub

        Public Property FirstName() As String Implements Interfaces.IPerson.FirstName
            Get
                Return _firstName
            End Get
            Set(ByVal value As String)
                _firstName = value
            End Set
        End Property

        Public Property Id() As System.Guid Implements Interfaces.IPerson.Id
            Get
                Return _id
            End Get
            Set(ByVal value As System.Guid)
                _id = value
            End Set
        End Property

        Public Property LastName() As String Implements Interfaces.IPerson.LastName
            Get
                Return _lastName
            End Get
            Set(ByVal value As String)
                _lastName = value
            End Set
        End Property

        Public Overrides Function ToString() As String
            Return _lastName & " " & _firstName
        End Function
    End Class
End Namespace


Nothing fancy, not even pretty. But it works.

Then the dal

I start with an interface for the factory.

Imports StructureMap

Namespace Dal.Factory
    <PluginFamily("SQLServerDaoFactory", Issingleton:=True)> _
    Public Interface IDAOFactory
        ReadOnly Property Person() As Dal.Interfaces.IPerson
    End Interface
End Namespace

And here we have the first attribute for structuremap. this says that if you want an instance of this interface that you will have to look for a class with an attribute plugable and a concretekey of "SQLServerDaoFactory" in other words this is the default implementation of our interface.

Now lets look at SQLServerDAOFactory.

Imports StructureMap

Namespace Dal.SQLServer
    <Pluggable("SQLServerDaoFactory")> _
    Public Class DaoFactory
        Implements Dal.Factory.IDAOFactory

        Public ReadOnly Property Person() As Interfaces.IPerson Implements Factory.IDAOFactory.Person
            Get
                Return ObjectFactory.GetInstance(Of Interfaces.IPerson)()
            End Get
        End Property
    End Class
End Namespace
so this has a plugabble attribute with SQLServerDaoFactory as key. So this is the default implementation for IDaoFactory.

Now we will create a form with 2 labels on them and One button. Just leave the standard, this is just to show how it works. I won't even bother creating a presenter, let's talk dirty.

In the form_load event you have to add this to intialize structuremap.

StructureMapConfiguration.UseDefaultStructureMapConfigFile = False
StructureMapConfiguration.ScanAssemblies.IncludeTheCallingAssembly()

And in the button_click event you have to add this

Dim a As Model.Person
Dim d As Dal.Factory.IDAOFactory = ObjectFactory.GetInstance(Of Dal.Factory.IDAOFactory)()
a = d.Person.FindPersonbyName("")
Label1.Text = a.FirstName
Label2.Text = a.LastName

Don't forget to add structuremap.dll as a reference and to do an imports of structuremap in the form.
As you can we are doing a getinstance on ObjectFactory this will get us the default implementation of DAOFactory. Namely SQLServerDAOFactory

So why are we doing all this? Since we could have just instantiated it the normal way without a problem.

What if we now needed to have a MySQL Database instead of SQLServer? in our normal program we had to change all the references from SQLServerDAOFactory to MySQLFactory with structuremap we just change the pluginfamily default value and create a new daofactory.

this is the new daofactory.

Imports StructureMap

Namespace Dal.MySQL
    <Pluggable("MySQLDaoFactory")> _
    Public Class DaoFactory
        Implements Dal.Factory.IDAOFactory

        Public ReadOnly Property Person() As Interfaces.IPerson Implements Factory.IDAOFactory.Person
            Get
                ObjectFactory.InjectStub(GetType(Interfaces.IPerson), New MySQLPerson)
                Return ObjectFactory.GetInstance(Of Interfaces.IPerson)()
            End Get
        End Property
    End Class
End Namespace


and this is the adapted idaofactory.

Imports StructureMap

Namespace Dal.SQLServer
    <Pluggable("MySQLDaoFactory")> _
    Public Class DaoFactory
        Implements Dal.Factory.IDAOFactory

        Public ReadOnly Property Person() As Interfaces.IPerson Implements Factory.IDAOFactory.Person
            Get
                Return ObjectFactory.GetInstance(Of Interfaces.IPerson)()
            End Get
        End Property
    End Class
End Namespace


and now run the code again and see the difference in the labels. So we have low coupling and high cohesion.

Hope to see you soon for part 2




3/16/2008 3:39 PM Romance Standard Time  #    Disclaimer  |  Comments [0]  |  Trackback
 Thursday, January 17, 2008
I think this is kinda neat ;-)

No more writting of compareto's or equals just use linq.


Dim _Directories() As String Dim _Directory As String Dim _DirectoryInfos As New List(Of DirectoryInfo)

_Directories = Directory.GetDirectories("c:/")
For Each _Directory In _Directories
Dim directoryinfo As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(_Directory)
_DirectoryInfos.Add(directoryinfo)
Next ' Run LINQ Query Dim _DirectoryInfosOrderedByCreationTime = From DirectoryInfos In _DirectoryInfos _
Order By DirectoryInfos.CreationTime Descending _
Select DirectoryInfos

' Display results of query If _DirectoryInfosOrderedByCreationTime.Count > 0 Then For Each DirectoryInfo In _DirectoryInfosOrderedByCreationTime
TextBox1.AppendText("Directory: " & DirectoryInfo.FullName & " Date: " & DirectoryInfo.CreationTime & ControlChars.CrLf)
Next End If



1/17/2008 11:16 PM Romance Standard Time  #    Disclaimer  |  Comments [3]  |  Trackback
 Tuesday, January 15, 2008
The first one is about MVP and dependecy injection and threading.

And Allthough it's not perfect it does explain a lot. However, agian the example is to simple and therefor more work needs to be done to really understsand the concepts.

The next one is about SQL-Server interview questions.

A bit different from the one on Denis' page but still contains a few usefull tips.

The third and last one is an introduction to Object oriented programming concepts.

What can I say. Sometimes a bit simple. But simple can be good.

1/15/2008 9:13 AM Romance Standard Time  #    Disclaimer  |  Comments [0]  |  Trackback